经常在使用 Linux 的时候会发现有一些内存经常被 Cache 和 Buffer 占用,而关于这两者之间的关系与区别却不了解,这篇文章主要就是介绍一下两者的区别与相关的运维手段。
一、含义
Cache(缓存):指 CPU 和内存之间高速缓存,为了调高CPU和内存之间数据交换而设计,用来给文件做缓存(相关的是PageCache),主要是针对读操作设计的;
Buffer(缓冲):指在写入磁盘前的存储在内存中的内容,为了提高内存和硬盘(或其他I/O设备的数据交换而设计),主要是针对写操作设计的;
下面为Linux下free指令显示的信息,以下简单描述一下各选项的含义:
[root@* ~]# free -g |
- Mem:表示物理内存的统计信息;
- Swap:表示磁盘上交换分区的使用情况;
- total:总的内存大小;
- used:已经使用的内存大小(包含buff/cache和shared的大小);
- free:空闲的内存大小;
- shared:进程间的内存大小;
- buff:写磁盘的数据在内存中缓存的数据大小,能够快速响应,后续会将数据定期刷到磁盘上;
- cache:读取的数据在内存中缓存的数据大小,下次读取时能够快速返回;
- available:真正可用的内存大小;
二、缓存相关脚本
2.1、缓存清理方式
清理
pagecache
(页面缓存):echo 1 > /proc/sys/vm/drop_caches # sysctl -w vm.drop_caches=1
清理
dentries
(目录的数据结构)和inodes
(文件的数据结构):echo 2 > /proc/sys/vm/drop_caches # sysctl -w vm.drop_caches=2
清理
pagecache
(页面缓存)、dentries
(目录的数据结构)和inodes
(文件的数据结构):echo 3 > /proc/sys/vm/drop_caches # sysctl -w vm.drop_caches=3
2.2、缓存使用分析
2.2.1、slabtop指令
内核的模块在分配资源的时候,为了提高效率和资源的利用率,都是透过slab
来分配的。通过slab
的信息,再配合源码能粗粗了解系统的运行情况,比如说什么资源有没有不正常的多,或者什么资源有没有泄漏。Linux系统透过/proc/slabinfo
来向用户暴露slab的使用情况。
Linux所使用的 slab 分配器的基础是Jeff Bonwick
为 SunOS
操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。Linux slab 分配器
使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分配器。
使用slabtop
命令可以实时的显示内核中slab缓冲区
的细节信息,相关选项参数为:
--delay=n, -d n:每n秒更新一次显示的信息,默认是每3秒; |
2.2.2、使用fincore(C)或pcstat(Go)分析程序的cache的占用
fincore
是linux-ftools
工具集中的一个工具,其他的工具还有fallocate
和fadvise
,linux-ftools
项目原来在Google Code
上进行维护,但是Google Code
已经在2016年就停止维护了,不过依旧可以在Github上寻找到该项目,目前我也将该项目迁移到了我自己的Github主页上,并做了一些简单的变动,项目地址为:bugwz/linux-ftools,fincore的编译安装在项目中有详细介绍。
pcstat工具实现了与fincore
相同的功能,并且输出效果看起来更为优雅,不过目前这里只演示fincore
的工具使用。
fincore
工具运行如下所示:
[root@*-self linux-ftools]# ./fincore |
使用fincore
工具配合Shanker提供的脚本,即可简单的查看cache
的占用情况,相关脚本如下所示:
|
执行脚本的结果如下所示:
Name Size(bytes) TotalPages CachedPages CachedSizes CachedPercent |