一, 案例入门
我们来看一个例子, 我们来看 free 输出, free 采集数据来源是:/proc/meminfo 文件, 对于这个文件, 会贯穿这个系列.
- root@szdc-calic-2-6:~# free
- total used free shared buff/cache available
- Mem: 32895096 1698396 8197904 307688 22998796 30343448
- Swap: 31250428 114992 31135436
从上面的输出我们可以得到什么呢? 系统当前内存是否够用? 什么是 buffer, 什么是 cqche, 带着这些问题, 我们接着往下看.
二, cache 和 buffer
2.1 cache
2.1.1 定义
首先明确一点, 在内存管理中, cache 指的是: page cache.page cache 即页面高速缓存, 是针对文件系统的, 存储的是文件的文件数据 (文件分为元数据和文件数据).
2.1.2 哪些 cache 无法被回收
我们执行回收 cache 命令
- [root@k8s-dbg-master-1 ~]# echo 3> /proc/sys/vm/drop_caches
- [root@k8s-dbg-master-1 ~]# free -m
- total used free shared buff/cache available
- Mem: 32117 8622 720 16056 22773 949
- Swap: 16383 216 16167
从上面我们知道, 即使我们执行清理 cache 命令, 仍然有部分 cache 无法回收, 这些无法回收的包括: tmpfs, 共享内存, mmap 申请标志状态为 MAP_SHARED 的内存. 这块不深入讲解, 有兴趣的再去自己尝试下.
2.2,buffer
2.2.1 定义
(1) 在内存管理中, buffer 指的是: buffer cache.buffer cache 是是块设备的读写缓冲区. 我们继续补充知识, 操作系统是以块的概念操作磁盘的, 一个块会包含一个或者多个扇区, 但是不会超过一个页面大小.
(2) buffers 主要用于缓存文件系统中的元数据信息 (dentries,inodes), 和另外一些不是文件数据的块, 例如 metadata 和 raw block I/O, 因此还是需要单独用 buffer cache 来缓存.
2.3 两者之间的关系
在内核 2.6 以后, 两者结构进行统一, 都是 page cache,page 中含有一个个的 buffer 结构, 所以我们的 free 命令中, 也将两者进行统一. 两者是配合使用的, 当我们对一个文件进行写操作时候, page cache 的内容会被改变, 而 buffer cache 则可以将 page 标记不同的缓冲区 (buffer), 并记录哪个块被修改, 这样, 脏数据回写时候, 就不用回写整个 page, 而只要回写修改的块.
三, 案例分析
3.1 案例分析
我们将直接使用案例对 cache 进行分析, 看看操作系统中会如何使用. 事先准备一个大文件, 对大文件进行读操作.
(1) 手动清空 cache
- [root@k8s-dbg-master-1 ~]# echo 3> /proc/sys/vm/drop_caches
- [root@k8s-dbg-master-1 ~]# cat /proc/meminfo
- MemTotal: 32887860 kB
- MemFree: 15764108 kB
- MemAvailable: 17081976 kB
- Buffers: 1792 kB
- Cached: 1191456 kB
(2) 执行命令及结果
- [root@k8s-dbg-master-1 ~]# cp hyperkube /tmp/hyperkube
- [root@k8s-dbg-master-1 ~]# cat /proc/meminfo
- MemTotal: 32887860 kB
- MemFree: 15240656 kB
- MemAvailable: 17092320 kB
- Buffers: 18016 kB
- Cached: 1708088 kB
可以看到, cached 和 buffer 都增多
四, 问题
1, 现在试着回答刚开始提出的问题: 目前的系统内存情况是怎么样的
五, 参考文献
- , https://www.cnblogs.com/sparkdev/p/7994666.html
- , http://linuxperf.com/?p=142
来源: https://juejin.im/post/5c128b3ee51d455c573b9134