当前位置:首页>Linux>Linux系统内核 内存Cache爆满定位方法:工具与 /proc 方式

Linux系统内核 内存Cache爆满定位方法:工具与 /proc 方式

  • 2026-10-23 12:19:04
Linux系统内核 内存Cache爆满定位方法:工具与 /proc 方式

Linux 系统中,内核的缓存(Cache)是提升文件访问性能、降低磁盘 IO 的关键机制,但在高并发或大文件操作场景下,Cache 却可能成为“内存占用大户”,开发人员可能会困惑:内存被谁使用,优化的目的不够明确,无从下手。

我们从工程角度看,系统梳理 Linux 内核 Cache 的几类类型,详细介绍每类缓存的统计信息和排查工具,帮助快速定位到内存占用的原因。


一、Linux 内存缓存分类

在 Linux 中,内存缓存主要分为三类:

  1. Page Cache(文件缓存)

    • 存储文件系统中的文件页(file page),避免重复磁盘读取。

    • 不属于单一进程,而是全局共享。

  2. Slab Cache(内核对象缓存)

    • 内核维护的一种高速对象缓存,用于缓存 inode、dentry、socket buffer 等内核对象。

    • 通过 slab 分配器管理,按对象类型统计。

  3. 专用子系统缓存

    • 网络 buffer(skbuff)、conntrack、tmpfs/shmem 等。

    • 往往与高并发网络、容器或共享内存密切相关。


二、Page Cache 监控与排查

1. /proc/meminfo 关键字段

cat /proc/meminfo

常用字段说明:

字段
含义
MemTotal
总内存大小
MemFree
系统空闲内存
Buffers
内核缓冲区,占用内存的一部分,可被回收
Cached
文件页缓存(page cache)
SReclaimable
可回收 slab(内核对象缓存的一部分)
Shmem
tmpfs / 共享内存使用量
Available
应用程序可用内存(包含可回收缓存)

排查思路:Cached 或 SReclaimable 很大,但 Available 充足,通常不必担心内存泄漏。

2. free 命令快速观察

free -h

输出示例:

              total        used        free      shared  buff/cache   availableMem:           64Gi       40Gi       4Gi       1Gi        20Gi       22GiSwap:           8Gi        1Gi       7Gi
  • buff/cache 表示被 page cache 和 buffer 占用的内存。

  • 对应 /proc/meminfo 的 Buffers + Cached + SReclaimable。


3. 查看具体文件占用:vmtouch / fincore

(1) vmtouch

vmtouch -v /var/log

输出示例:

/var/log/syslog 4096K 4096K resident/var/log/kern.log 1024K 1024K resident
  • resident 表示页在 page cache 中。

  • 可用于定位“哪些目录 / 文件占用了大量缓存”。

(2) fincore

fincore -a /var/lib/mysql
  • 按文件列出占用 page cache 的页数。

  • 可结合定时脚本监控数据库缓存行为。


4. 问题排查思路

  • 检查 page cache 消耗量大但应用占用小 → 正常缓存。

  • 查看大文件是否仍在缓存 → 使用 vmtouch 或 fincore。

  • 是否有已删除文件仍被进程打开 → lsof | grep deleted。


三、Slab Cache 监控与排查

1. slabtop 交互查看

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
  • CACHE:缓存类型,如 dentry、inode_cache、skbuff_head_cache。

  • NUM:对象总数。

  • ACTIVE:当前正在使用的对象数。

  • %USED:使用率。

2. /proc/slabinfo 查看

cat /proc/slabinfo | grep dentry
  • 每行表示一个 slab 缓存类型。

  • 字段依次为:

    • 名称、对象大小、分配对象数量、活动对象数量、缓存页数等。

3. 定位异常 slab

  • dentry / inode_cache 持续增长 → 文件系统频繁操作。

  • skbuff_head_cache 持续增长 → 网络数据包积压,可能丢包。

可结合:

cat /proc/net/sockstatcat /proc/net/sockstat6

    四、网络及子系统缓存

    1. TCP/UDP Buffer

    cat /proc/net/sockstat

    输出示例:

    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
    • inuse:当前连接数。

    • mem:占用内存页数。

    • 高 mem 与 skbuff_head_cache 增长关联。

    2. conntrack 缓存

    cat /proc/sys/net/netfilter/nf_conntrack_countcat /proc/sys/net/netfilter/nf_conntrack_max
    • nf_conntrack_count 接近 nf_conntrack_max → 网络连接表满,内核对象占用上升。

    3. tmpfs / Shmem

    cat /proc/meminfo | grep Shmem
    • tmpfs 文件系统的占用内存,可能被容器或应用频繁读写。

    • 可结合 cgroup 查看具体容器占用:

    cat /sys/fs/cgroup/memory/<cgroup>/memory.stat

    五、容器 / cgroup 维度的 Cache 监控

    memory.stat 文件可以精确看到某个 cgroup 内的缓存占用:

    cat /sys/fs/cgroup/memory/docker/<container_id>/memory.stat
    字段说明:
    字段
    含义
    rss
    实际使用内存
    cache
    page cache + slab cache
    mapped_file
    映射文件页
    swap
    swap 占用

    六、高级内核跟踪(线上谨慎使用)

    1. perf 统计 cache 行为

    perf stat -e cache-misses,cache-references -a sleep 10
    • cache-misses:CPU cache miss 次数。

    • cache-references:CPU cache 访问次数。

    2. eBPF / bpftrace 监控 page cache

    bpftrace -e 'tracepoint:mm:mm_filemap_add_to_page_cache { @[comm] = count(); }'
    • 按进程统计向 page cache 写入的页数。

    • 可以精确判断“哪类应用频繁产生缓存”。


    七、工程化排查流程

    1. 总览内存使用情况

      free -hcat /proc/meminfo
    2. 查看 slab / 内核对象
    slabtopcat /proc/slabinfo
    3. 排查 Page Cache 文件
    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
    5.容器 / cgroup 内存分离
    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,可精确统计进程贡献。

    按照本文方法排查,可以在系统级别清晰定位内存占用来源,避免误判内存泄漏,也方便针对性优化。

    最新文章

    随机文章