Linux系统中的缓存是提升性能的关键机制,通过将频繁访问的数据存储在内存中,减少磁盘I/O操作,从而加快程序响应速度和系统整体效率,要查看Linux中的缓存使用情况,需从不同角度入手,包括内存整体缓存状态、文件系统缓存、目录项与inode缓存、内核对象缓存(slab)等,本文将详细介绍各类缓存的查看方法及常用命令,帮助用户全面掌握Linux缓存监控技巧。
使用free命令查看内存及缓存概况
free
命令是最基础的内存查看工具,可直接展示系统内存使用情况及缓存占用,其常用参数包括-h
(人类可读格式,如KB/MB/GB)和-m
(以MB为单位输出)。
执行free -h
后,输出字段包括:
total
:总内存大小;used
:已用内存(包含应用占用和缓存);free
:完全空闲内存;shared
:共享内存(如tmpfs);buff/cache
:缓存总量,其中Buffers
是块设备缓存(如磁盘元数据),Cached
是文件系统缓存(如文件数据);available
:可用内存(估算值,包含可回收的缓存)。
输出可能为:
total used free shared buff/cache available
Mem: 7.7Gi 2.1Gi 3.2Gi 123Mi 2.4Gi 5.1Gi
Swap: 2.0Gi 0B 2.0Gi
此处buff/cache
为2.4GB,说明系统有2.4GB内存用于缓存,若应用需要内存,内核可自动回收这部分空间。
使用vmstat监控内存及缓存动态
vmstat
(Virtual Memory Statistics)可实时监控系统进程、内存、I/O等状态,通过指定间隔参数,可观察缓存使用趋势。
常用格式:vmstat [间隔] [次数]
,例如vmstat 2 5
表示每2秒输出一次,共5次,重点关注以下字段:
cache
:Page Cache大小(文件系统缓存);buff
:Buffers大小(块设备缓存);free
:空闲内存;si
/so
:swap换入/换出量(若频繁非零,说明内存不足)。
示例输出:
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 3289120 123456 2457600 0 0 50 80 300 500 5 2 90 3 0
cache
列的2457600即Page Cache大小,单位为KB(约2.4GB),与free
命令结果一致。
查看/proc/meminfo获取详细缓存信息
/proc/meminfo
是内核导出的内存详细信息文件,包含更精细的缓存统计,可通过grep
过滤关键条目:
cat /proc/meminfo | grep -E "Cached|Buffers|Dirty|Writeback|PageTables"
主要条目说明:
Cached
:文件系统缓存(不包括Reclaimable Slab);Buffers
:块设备缓存;Dirty
:已修改但未写回磁盘的脏页;Writeback
:正在写回磁盘的页;PageTables
:页表内存占用。
例如输出:
Cached: 2457600 kB
Buffers: 123456 kB
Dirty: 10240 kB
Writeback: 0 kB
PageTables: 2048 kB
通过Dirty
和Writeback
可判断磁盘写入压力,若值持续较高,可能需关注磁盘性能。
查看目录项与inode缓存
文件系统依赖目录项(dentry,缓存文件名到inode的映射)和inode缓存(文件元数据)加速查找,相关信息位于/proc/sys/fs/
:
-
dentry缓存状态:
cat /proc/sys/fs/dentry-state
输出格式为
used unused age_limit
,其中used
为当前使用的dentry数量,unused
为未使用的数量。 -
inode缓存状态:
cat /proc/sys/fs/inode-state
输出格式为
inodes unused age_limit
,inodes
为已分配的inode数量,unused
为空闲数量。
若used
值接近系统限制(可通过fs.file-max
查看),可能导致文件查找变慢,需考虑调整缓存参数。
分析slab缓存(内核对象缓存)
slab是内核管理的小块内存分配器,用于缓存频繁使用的内核对象(如inode、dentry、task_struct等),查看/proc/slabinfo
:
cat /proc/slabinfo | head -n 20
输出字段包括name
(对象类型)、numactive
(活跃对象数)、numslabs
(slab块数)、objperslab
(每块对象数)等。
name active numobj objsize objperslab pagesperslab : tunables : slabdata
dentry 15234 15234 192 21 1 0 0 0 : tunables 0 0 0 : slabs 726 726 726
inode_cache 8765 8765 960 8 2 0 0 0 : tunables 0 0 0 : slabs 1096 1096 1096
若inode_cache
或dentry
占用过高,可通过echo 1 > /proc/sys/vm/drop_caches
手动清理(需先同步磁盘:sync
)。
使用第三方工具实时监控缓存
对于更精细的缓存分析,可安装第三方工具(如bcc-tools
):
-
cachestat:统计文件缓存命中率
cachestat 1 5 # 每秒输出,共5次
输出包括
HIT
(命中次数)、MISS
(未命中次数)、HIT%
(命中率)等,命中率低说明文件缓存未命中,需优化磁盘访问。 -
cachetop:按进程查看缓存访问
cachetop
按缓存命中排序,可定位高缓存消耗进程,帮助优化应用内存使用。
常用Linux缓存查看命令汇总
命令/文件 | 适用场景 | 示例 | |
---|---|---|---|
free -h |
内存及缓存总量 | 快速查看内存概况 | free -h |
vmstat 2 5 |
缓存动态变化 | 监控缓存趋势及内存回收 | vmstat 2 5 |
/proc/meminfo |
详细缓存条目(Dirty等) | 分析磁盘写入压力 | grep -E "Cached|Dirty" /proc/meminfo |
/proc/sys/fs/dentry-state |
dentry缓存状态 | 定位目录项缓存瓶颈 | cat /proc/sys/fs/dentry-state |
/proc/slabinfo |
内核对象缓存 | 分析slab内存占用 | head -n 20 /proc/slabinfo |
cachestat |
文件缓存命中率 | 优化文件访问性能 | cachestat 1 5 |
相关问答FAQs
问题1:清理Linux缓存(如echo 1 > /proc/sys/vm/drop_caches
)会影响系统性能吗?
解答:清理缓存会释放内存给应用使用,但若缓存被清理,后续访问相同数据时需重新从磁盘读取,可能导致短暂I/O延迟和性能下降,该操作仅适用于内存紧张时的临时缓解,不建议频繁执行,清理前需先执行sync
确保数据写入磁盘,避免数据丢失。
问题2:如何区分Page Cache和Buffers?
解答:Page Cache(通过free
或/proc/meminfo
中的Cached
字段查看)是文件系统缓存,用于缓存文件数据(如普通文件内容);Buffers(通过Buffers
字段查看)是块设备缓存,用于缓存块设备的元数据(如文件系统超级块、inode表、目录结构等),Page Cache服务于文件数据访问,Buffers服务于磁盘块操作,两者共同构成buff/cache
总量。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/37076.html