内存和CPU的关系之紧密,总所周知,我们先来看一下系统的内存使用情况
比如一个free获取到数据
这里面说明了Mem和Swap的使用情况
总内存 已用内存 缓存 可用内存
缓存指标中包含了 buffer和Cache
对应的Buffer和Cache的含义是什么,就是这次的重点
首先说,遇到这类不懂的指标,如何去做呢?首先使用的是man命令,可以尝试去查看对应的指令
对应的man free文档中,给出了对应的解释
buffers
Memory used by kernel buffers (Buffers in /proc/meminfo) cache Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo) buff/cache Sum of buffers and cache |
Buffer是内存缓冲区的内存,对应的是 proc/meminfo中的Buffers值
Cache是内核页缓存和Slab用到的内存,对应的是 /proc/meminfo的Cache和SReclaimable之和
对应的proc系统中的值的含义,仍没有搞清楚
接下来我们就i查看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. |
在其中
Buffers是原始磁盘款的存储,缓存磁盘数据的,将多次小的写请求合并为一次大的写请求
Cached则是从磁盘中读取文件的页缓存,缓存从文件读取的数据,下次访问文件数据的时候,直接走缓存
那么利用对应的讲解,我们可以考虑,难道Buffer只负责写,Cached只负责读吗?
我们做一些对应的情况讲解
场景1:
我们在第一个终端下,运行vmstat命令
在vmstat中
其中,我们有buffer cache bi bo四个指令
前面buffer和cache的两个指标,单位是KB
bi bo是块设备读取和写入的大小,为块/秒 即为kb/s
我们利用dd命令,生成一个500MB的文件
然后看vmstat命令的变化
可以看到
Cache在逐渐增长,而Buffer则是不变
对应的buffer则不变
IO情况下,Cache刚开始增长时候,
bi很少,但是一段时间后,会出现大量的bi增长,哪怕dd命令结束,bi还是会增长
那么是否说明Cache也涉及了对应的磁盘写?
先按下不表,我们尝试,直接写入磁盘呢?
dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048
我们查看对应的内存和IO变化情况
procs ———–memory———- —swap– —–io—- -system– ——cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 7584780 153592 97436 0 0 684 0 31 423 1 48 50 2 0 1 0 0 7418580 315384 101668 0 0 0 0 32 144 0 50 50 0 0 1 0 0 7253664 475844 106208 0 0 0 0 20 137 0 50 50 0 0 1 0 0 7093352 631800 110520 0 0 0 0 23 223 0 50 50 0 0 1 1 0 6930056 790520 114980 0 0 0 12804 23 168 0 50 42 9 0 1 0 0 6757204 949240 119396 0 0 0 183804 24 191 0 53 26 21 0 1 1 0 6591516 1107960 123840 0 0 0 77316 22 232 0 52 16 33 0 |
buff和cache都有增长,但是Buff更多,说明写磁盘的确涉及了Cache和Buffer
然后是尝试读
我们从tmp/file中读取数据写入 空设备
dd if=/tmp/file of=/dev/null
然后查看内存和IO的变化情况
vmstat的输出汇总,读取文件时候,Buffer是保持不变的,Cache则在不断的增长,Cache是对文件读的页缓存是没错的
对应的磁盘直接读,则是如下
dd if=/dev/sda1 of=/dev/null bs=1M count=1024
然后观察内存和IO的变化情况
对应的其中,Buffer和Cache都在增加
最终说明了Buffer和Cache中,Buffer可以作为写入磁盘数据的缓存,和磁盘读取数据的缓存
Cache可以作为文件读取数据的页缓存和写文件的页缓存
从文件和磁盘两个角度来进行了读写优化