Linux下free命令看到的buffer和cache的区别

结论

  • buffer是块设备的缓存
  • cache是文件系统的缓存

这里的缓存包括读和写。

实验证明

首先看看buffer和cache的值:

root@localhost:~# cat /proc/meminfo | grep -E 'Buffers|Cache'
Buffers:          238024 kB
Cached:          1041304 kB
SwapCached:        88328 kB

然后用dd读取块设备100M大小,并查看结果,可以发现buffer涨了100M。

root@localhost:~# dd if=/dev/vda of=/dev/null bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.334603 s,313 MB/s
root@localhost:~# cat /proc/meminfo |grep -E 'Buffers|Cache'
Buffers:          341480 kB
Cached:          1042240 kB
SwapCached:        88328 kB

试下再读一次,发现速度爆炸快,说明确实是直接从buffer里读取。

root@localhost:~# dd if=/dev/vda of=/dev/null bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.0202984 s,5.2 GB/s

接着用cat读取一个33M的文件,并查看结果,可以看到cache涨了33M。

root@localhost:~# ls -lh /var/log
......
-rw-r-----  1 xrdp        adm              33M 11月  6 15:26 xrdp.log
......
root@localhost:~# cat /var/log/xrdp.log > /dev/null
root@localhost:~# cat /proc/meminfo |grep -E 'Buffers|Cache'
Buffers:          341648 kB
Cached:          1075616 kB
SwapCached:        88328 kB

dd写入一个100M的文件,然后执行sync,同时观察vmstat:

root@localhost:~# dd if=/dev/zero of=test.img bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.0703571 s,1.5 GB/s
root@localhost:~# sync

可以发现dd写入速度非常快,同时cache涨了100M,但磁盘并未写入。执行sync的时候,磁盘才写入了100M。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0 214316 281576 338164 1019048    0    0     1    14    2    1  0  1 99  0  0
 0  0 214316 281416 338164 1019060    0    0     0     0  961  286  0  0 100  0  0
 0  0 214316 280808 338164 1019072    0    0     0     0 1111  294  0  1 99  0  0
 0  0 214316 280232 338164 1019080    0    0     0     0  951  294  1  1 98  0  0
 0  0 214316 280040 338164 1019088    0    0     0     0  765  279  1  0 99  0  0
 0  0 214316 176712 338164 1121500    0    0     0    44  988  352  0  7 93  0  0
 0  0 214316 176328 338164 1121508    0    0     0   300 1043  308  0  1 99  0  0
 0  0 214316 176392 338164 1121520    0    0     0     8  960  314  1  0 99  0  0
 0  0 214316 176296 338164 1121524    0    0     0     0  843  275  0  0 100  0  0
 0  0 214316 175944 338164 1121532    0    0     0   124  682  355  0  1 98  1  0
 0  0 214316 175616 338164 1121540    0    0     0 102760 1015  508  1  2 76 21  0
 0  0 214316 175752 338164 1121556    0    0     0     0  971  343  0  1 99  0  0

dd往块设备写入的时候buffer也是会涨的,因手头没有测试环境,这里不再实验。(听说buffer和cache都会涨)