Linux 系统中,内核的缓存(Cache)是提升文件访问性能、降低磁盘 IO 的关键机制,但在高并发或大文件操作场景下,Cache 却可能成为“内存占用大户”,开发人员可能会困惑:内存被谁使用,优化的目的不够明确,无从下手。
我们从工程角度看,系统梳理 Linux 内核 Cache 的几类类型,详细介绍每类缓存的统计信息和排查工具,帮助快速定位到内存占用的原因。
一、Linux 内存缓存分类
在 Linux 中,内存缓存主要分为三类:
Page Cache(文件缓存)
Slab Cache(内核对象缓存)
专用子系统缓存
二、Page Cache 监控与排查
1. /proc/meminfo 关键字段
常用字段说明:
| |
|---|
MemTotal | |
MemFree | |
Buffers | |
Cached | |
SReclaimable | |
Shmem | |
Available | |
排查思路:Cached 或 SReclaimable 很大,但 Available 充足,通常不必担心内存泄漏。
2. free 命令快速观察
输出示例:
total used free shared buff/cache availableMem: 64Gi 40Gi 4Gi 1Gi 20Gi 22GiSwap: 8Gi 1Gi 7Gi
3. 查看具体文件占用:vmtouch / fincore
(1) vmtouch
输出示例:
/var/log/syslog 4096K 4096K resident/var/log/kern.log 1024K 1024K resident
(2) fincore
fincore -a /var/lib/mysql
按文件列出占用 page cache 的页数。
可结合定时脚本监控数据库缓存行为。
4. 问题排查思路
检查 page cache 消耗量大但应用占用小 → 正常缓存。
查看大文件是否仍在缓存 → 使用 vmtouch 或 fincore。
是否有已删除文件仍被进程打开 → lsof | grep deleted。
三、Slab Cache 监控与排查
1. slabtop 交互查看
示例输出:
Active / Total Objects (% used) : 2594368 / 2711642 (95.7%) Active / Total Slabs (% used) : 87464 / 87464 (100.0%) Active / Total Caches (% used) : 79 / 118 (66.9%) Active / Total Size (% used) : 900895.88K / 925040.48K (97.4%) Minimum / Average / Maximum Object : 0.01K / 0.34K / 18.56K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME993642 927732 93% 0.10K 25478 39 101912K buffer_head445977 445977 100% 0.19K 21237 21 84948K dentry422607 422559 99% 1.05K 15445 30 494240K ext4_inode_cache135884 129622 95% 0.57K 4853 28 77648K radix_tree_node134208 123202 91% 0.99K 8388 16 134208K nfs_inode_cache
2. /proc/slabinfo 查看
cat /proc/slabinfo | grep dentry
3. 定位异常 slab
可结合:
cat /proc/net/sockstatcat /proc/net/sockstat6
四、网络及子系统缓存
1. TCP/UDP Buffer
输出示例:
cat /proc/net/sockstatsockets: used 351TCP: inuse 25 orphan 0 tw 0 alloc 40 mem 5UDP: inuse 19 mem 11UDPLITE: inuse 0RAW: inuse 0FRAG: inuse 0 memory 0
2. conntrack 缓存
cat /proc/sys/net/netfilter/nf_conntrack_countcat /proc/sys/net/netfilter/nf_conntrack_max
3. tmpfs / Shmem
cat /proc/meminfo | grep Shmem
cat /sys/fs/cgroup/memory/<cgroup>/memory.stat
五、容器 / cgroup 维度的 Cache 监控
memory.stat 文件可以精确看到某个 cgroup 内的缓存占用:
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.stat
六、高级内核跟踪(线上谨慎使用)
1. perf 统计 cache 行为
perf stat -e cache-misses,cache-references -a sleep 10
2. eBPF / bpftrace 监控 page cache
bpftrace -e 'tracepoint:mm:mm_filemap_add_to_page_cache { @[comm] = count(); }'
按进程统计向 page cache 写入的页数。
可以精确判断“哪类应用频繁产生缓存”。
七、工程化排查流程
总览内存使用情况
slabtopcat /proc/slabinfo
vmtouch -v /datafincore -a /datalsof | grep deleted
4.网络 / tmpfs / conntrack 排查
cat /proc/net/sockstatcat /proc/sys/net/netfilter/nf_conntrack_countcat /proc/meminfo | grep Shmem
cat /sys/fs/cgroup/memory/<cgroup>/memory.stat
6.必要时使用 perf / bpftrace 跟踪热点
Page Cache 不是按进程占用,回收由内核自动完成,工程排查主要定位异常增长的 slab 或特定应用行为。
总结一下
Linux 内核缓存体系复杂,但只要按分类掌握工具与 /proc 文件:
Page Cache → 文件缓存,可用 vmtouch/fincore 定位。
Slab Cache → 内核对象缓存,用 slabtop/slabinfo 分析。
网络 / tmpfs / conntrack → 子系统缓存,结合 sockstat、Shmem、cgroup 统计。
高级追踪 → perf/eBPF,可精确统计进程贡献。
按照本文方法排查,可以在系统级别清晰定位内存占用来源,避免误判内存泄漏,也方便针对性优化。