1.概念介绍
在Linux系统使用“free -w”命令查看内存使用情况。该文通过查看源码的方式,介绍下图中buffers和cache的具体含义。
2.源码分析
该文参考的内核版本为4.19。在我们查看系统资源使用情况时,一般我们都借助Linux提供的/proc 目录下的信息进行分析。比如“free -w”命令的信息来源于/proc/meminfo。/proc下的信息的具体含义,可以分析内核源码获得。
2.1 /proc/meminfo信息
通过命令“cat /proc/meminfo”可以获取系统中关于内存的整体信息,我们重点关注下图信息中的Buffers和Cached项。
上图中Buffers的数值等于“free -w”中buffers对应的数值。而Cached的数值小于“free -w”中cache对应的数值。这是因为,Cached和SReclaimable表示的数值和等于“free -w”中cache对应的数值。SReclaimable表示可回收的Slab缓存,该文不关心SReclaimable数值,主要分析Cached和Buffers数值。
2.2 源码分析
内核源代码fs/proc/meminfo.c文件中包含了命令“cat /proc/meminfo”具体执行步骤和显示的信息,源代码如下(只保留必要的函数)。
对应的公式如下:
vm_node_stat[NR_FILE_PAGES] = Buffers+Cached。
Buffers = 块设备inode节点管理的缓存。
Cached = 普通文件inode节点管理的缓存。
普通文件和块设备的缓存总大小统计在vm_node_stat[NR_FILE_PAGES]变量中。meminfo中Buffers统计了块设备文件(如/dev/sd*)inode节点管理的缓存。meminfo中Cached统计了总缓存减去Buffers缓存大小,即普通文件inode节点管理的缓存。
在Linux系统中普通文件和块设备文件都会创建inode节点。当操作普通文件时,文件的缓存由其inode节点进行管理,比如open("/file.txt")后的read/write操作。操作块设备时,块设备的缓存也由其inode节点进行管理,比如open("/dev/sd*")后的read/write操作。
注:Buffers和Cached只是数字,数字的具体含义是什么,看源码是最简单直接的方式。