free 输出:
free.png
total
内存总量,等同于 /proc/meminfo 中的 MemTotal
和 SwapTotal
之和。
used
已使用的内存。计算公式为:used = total - free - buffers - cache
free
未被使用的物理内存,等同于 /proc/meminfo 中的 MemFree
和 SwapFree
)
shared
通常是临时文件系统使用的内存,等同于 /proc/meminfo 中的 Shmem
(自内核 2.6.32 版本可用,不可用则显示为 0)
available
是从应用程序的角度看到的可用内存数量。
Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。
当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。
buffer/cache
查阅 man free 和 /proc 得知:
- Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so).- Cached %lu
In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached.- SReclaimable %lu (since Linux 2.6.19)
Part of Slab, that might be reclaimed, such as caches.- SUnreclaim %lu (since Linux 2.6.19)
Part of Slab, that cannot be reclaimed on memory pressure.
Buffer 可以用作"将要写入磁盘数据的缓存",也可以用作"从磁盘读取数据的缓存"。
Cache 可以用作"从文件读取数据的页缓存",也可以用作"写文件的页缓存"。
Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们都可以用在读请求中,也会用在写请求中。
具体查看buffer/cache的大小
# cat /proc/meminfo
...
Buffers: 174448 kB
Cached: 1914600 kB
...
利用 vmstat 命令 探究Buffer 和 Cache
-
清理文件页,目录项,Inodes等各种缓存
echo 3 > /proc/sys/vm/drop_caches
-
再第一个终端执行
vmstat
命令# vmstat -w 1 # -w 后跟刷新间隔 procs ----------------memory-----------------------swap-- -----io----... r b swpd free buff cache si so bi bo ... 2 0 0 1315212 7692 247288 0 0 5 31 ... 2 0 0 1315212 7692 247304 0 0 0 0 ...
- swpd:使用的虚拟内存数量
- si:一部分内存从swap分区(磁盘)被移动到了内存
- so:一部分内存被移动到了swap分区(磁盘)
- bi:从块设备收到的快数量(磁盘->内存)
- bo:发送到块设备的块数量(内存->磁盘)
空闲的系统下,
-
向磁盘写文件测试
再第二个终端执行dd
,通过读取随机设备,生成一个 1024MB 大小的文件# dd if=/dev/urandom of=/tmp/file bs=1M count=1024
观察第一个终端的Buffer 和 cache 的变化
r b swpd free buff cache si so bi bo 0 0 0 1309856 9008 251504 0 0 0 0 0 0 0 1309888 9008 251508 0 0 0 0 1 1 0 1158160 9024 402264 0 0 76 6308 1 1 0 1008280 9044 552152 0 0 16 167980 1 1 0 845100 9052 715320 0 0 8 145412 1 1 0 665056 9064 895312 0 0 12 108544 1 1 0 509152 9068 1051080 0 0 4 141320 1 2 0 387088 9080 1173224 0 0 8 82040 1 1 0 262840 9088 1297424 0 0 4 145516 0 1 0 243836 9092 1317456 0 0 4 98312
会发现:
- Cache 在不停地增长,而 Buffer 基本保持不变。
-
直接裸写磁盘,绕过文件系统
第二终端执行如下:# echo 3 > /proc/sys/vm/drop_caches # dd if=/dev/urandom of=/dev/vda1 bs=1M count=2048
再观察第一个终端输出:
会发现:
- 写磁盘时(也就是 bo 大于 0 时),Buffer 和 Cache 都在增长,但显然 Buffer 的增长快得多。
所以综上2个例子:
Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。
- 让free持续运行一段时间
free -s 3 # 每隔3s执行一次、
网友评论