Linux内存工作原理之案例分享
此视频部分内容由 小红书(www.xiaohongshutuiguang.cn)转载提供
清理系统缓存
#清理文件页、目录项、Inodes 等各种缓存
echo 3> /proc/sys/vm/drop_caches
a>磁盘和文件写案例
终端1:首先输出vmstat
buff 和 cache就是前面说的Buffers 和 Cache,单位是KB
bi 和 bo 则分别表示块设备读取和写入的大小,单位为 块/秒。因为Linux中块的大小是1KB,所以等价于KB/s
终端2:执行dd命令,通过读取随机设备,生成一个500MB大小的文件
ddif=/dev/urandom of=/tmp/file bs=1M count=500
终端1:继续观察vmstat中的Buffer 和 Cache。
发现在dd命令运行时,Cache 在不停地增长,而Buffer 基本保持不变:
在cache刚开始增长时,块设备I/O很少,bi值 只出现了一次 488KB/s,bo 则只有一次4KB,过一段时间后,才会出现大量的块设备写,bo甚至高达12880 KB/s
当dd命令结束后,Cache不在增长,但是块设备写还会持续一段时间,并且多次I/O写的结果加起来,才是dd要写的500M数据
终端2:清理缓存后,向磁盘/dev/sdb1 写入2GB的随机数据
#清理文件页、目录项、Inodes 等各种缓存
echo 3> /proc/sys/vm/drop_caches
#运行dd 命令向磁盘分区 /dev/sdb1 写入2G数据
dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048
终端1:观察内存和I/O变化
此时可以看出,虽然都是写数据,但是写磁盘和写文件的现象不太一样。写磁盘时(也就是bo大于0时),Buffer和Cache都在增长,但是显然Buffer增长的快很多。这说明,写磁盘用到了大量的Buffer。
关于Cache,在写文件时会用到Cache缓存数据,而写磁盘则会用到Buffer缓存数据。所以,Cache是文件读的缓存,实际Cache也会缓存写文件时的数据。
b>磁盘和文件读案例
终端2:从文件/tmp/file中读取数据写入空设备
#清理文件页、目录项、Inodes 等各种缓存
echo 3> /proc/sys/vm/drop_caches
#运行dd 命令读取文件数据dd if=/tmp/file of=/dev/null
终端1:vmstat观察内存和I/O变化情况
观察vmstat输出,发现读取文件时(bi大于)),Buffer保持不变,而Cache在不停增长。
终端2:清理缓存,从磁盘分区 /dev/sda1中读取数据,写入空设备
#清理文件页、目录项、Inodes 等各种缓存
echo 3> /proc/sys/vm/drop_caches
#运行dd 命令读取文件数据
dd if=/dev/sda1 of=/dev/nullbs=1M count=1024
终端1:vmstat观察内存和I/O变化情况
发现在读磁盘时(bi大于0),Buffer和Cache都在增长,但显然Buffer增长的快很多。说明读磁盘时,数据缓存到了Buffer中。
c>总结
Buffer 既可以用作写入磁盘数据的缓存,也可以用作从磁盘读取数据的缓存
Cache 既可以用作从文件读取数据的也缓存,也可以用作写文件的页缓存
Buffer是对磁盘数据的缓存,而Cache是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。