1.Buffer和Cache的区别
(1)什么是Buffer
- Buffer指Linux内存的 Buffer cache(缓冲区)。
- Buffer为了让不同的速度的设备能够同步,建立的一个缓冲区域,写进Buffer的数据是为了从中拿出写入其他设备。
buffers: Memory used by kernel buffers (Buffers in /proc/meminfo) 内核缓冲区的内存,是/proc/meminfo 中的 Buffers 值
(2)什么是Cache
- Cache指Linux内存中的 Page cache(缓存区)。
- Cache是为了提高读取速度,将经常或马上需要的数据预读到缓存中,写进Cache的数据是为了其他设备从中去读取。
cache: Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo) 页缓存和 Slab 用到的内存,是 /proc/meminfo 中的 Cached 与 Slab之和
3)二者的区别
- 从软件这一层来说,Buffer是块设备的缓冲,Cache是文件系统的缓存。以Linux为例,Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。
- Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。
- Buffer 的主要目的是在不同应用、线程、进程之间共享字节数据,例如为了让不同速度的设备能够进行数据同步,就会使用共享 Buffer。
- Cache 的主要目的是提高字节数据的读取/写入速度,例如根据时间局部性、地址局部性操作系统提供 page cache 机制。
2.磁盘和文件写入操作案例
- Linux中的虚拟设备
#读它的时候,它会提供无限的空字符; 另一个常见用法是产生一个特定大小的空白文件 /dev/zero #随机数设备,提供不间断的随机字节流, 当系统中断过多时,/dev/random设备会 挂起 ,产生数据速度较慢,但随机性好 /dev/random #随机数设备,提供不间断的随机字节流, 不依赖系统中断,数据产生速度快,但随机性较低 /dev/urandom #看作"黑洞",它等价于一个只写文件,所有写入它的内容都会永远丢失 /dev/null
- 写入之前先清理一下Buffer/Cache
#用命令来释放缓存, 建议先执行sync命令, 将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、延迟的块 I/O 等 #1:释放页缓存 echo 1 > /proc/sys/vm/drop_caches #2:释放dentries和inodes,即清除回收slab分配器中的对象 echo 2 > /proc/sys/vm/drop_caches # 3:释放所有缓存 echo 3 > /proc/sys/vm/drop_caches
(1)写入文件案例
- 一个终端执行 vmstat 监视负载信息
vmstat 2
- 一个终端监控内存信息
free -h -w -s 5
- 在另外一个终端执行dd,把安全的随机设备 /dev/urandom,写入/tmp/test.txt文件,写入的数据大小500M
dd if=/dev/urandom of=/tmp/test.txt bs=1M count=500
- 发现写入文件的时候,Cache中会增加。
(2)写入磁盘案例
- 写入磁盘前也是先清理下缓存。
# 首先清理缓存 echo 3 > /proc/sys/vm/drop_caches
- 然后运行dd命令向磁盘分区/dev/sdb1写入2G数据
dd if=/dev/urandom of=/dev/sda bs=1M count=2048
可以看到,虽然同是写数据,写磁盘和写文件的想象很不一样,写磁盘时即bo 大于 0时,Buffer和 Cache都在增长,但显然 Buffer的增长快得多。写磁盘用到了大量的 Buffer.我们发现,写文件时会用到Cache缓存数据,而写磁盘则会用到Buffer r 来缓存数据。所以,Cache即缓存读文件也缓存写文件。
3.磁盘和文件读取操作案例
- 首先清理一下缓存
echo 3 > /proc/sys/vm/drop_caches
(1)文件读取案例
dd if=/tmp/test.txt of=/dev/null
- 读取文件时,发现bi增长,Buffer保持不变,而Cache再不断增长。
(1)磁盘读取案例
dd if=/dev/sda of=/dev/null
读取磁盘时,发现bi增长,Buffer不断增长,而Cache保持不变,证明我们之前说的结论是对的,读写文件时操作的是cache,读写磁盘时操作的是buffer。
由此我们得知:
Buffer 是对磁盘数据的缓存,它即可以作为将要写入的磁盘数据的缓存,也可以作为从磁盘读取数据的缓存。
Cache 是对文件数据的缓存,它即可以作为从文件读取数据的页缓存,也可以用作写文件的页缓存。
我们都知道,文件是通过文件系统负责和磁盘交互,磁盘是块设备文件,直接读写磁盘或者分区,就会跳过文件系统,产生裸I/O,因此 文件和磁盘的缓存 的管理非常不同。
4.Cache和Buffer的命中案例
- 首先先清理一下缓存
echo 3 > /proc/sys/vm/drop_caches
(1)文件写入读取案例
# 先向文件中写入500M dd if=/dev/urandom of=/tmp/test.txt bs=1M count=500 # 然后再将其读取出来 dd if=/tmp/test.txt of=/dev/null
(2)磁盘写入读取案例
# 先读取1G的数据到buffer dd if=/dev/sda1 of=/dev/null bs=1M count=1024 # 然后在读取一遍,看看有没有命中缓存 dd if=/dev/sda1 of=/dev/null bs=1M count=1024
至此,整篇对Buffer和Cache的作用以及演示就到这里了,由上面的案例我们也最终确认了开头的结论:
- cache用于文件读写的缓存。
- buffer用于磁盘读写的缓存,也就是裸I/O。