发布于2026-08-21 阅读(0)
扫一扫,手机访问
/proc/meminfo 是唯一准确反映内存去向的来源,free 的 used 列语义混乱;应重点关注 MemA vailable、AnonPages、Shmem、Active/Inactive(file)、Buffers 等字段,避免误判内存占用。

/proc/meminfo在Linux系统中,想知道内存“被谁占了”,通过free命令输出的used列可没办法搞清楚。为啥呢?因为这个列在不同的内核版本里,含义根本不一样。在free v3.2.8版本中,它是total - free;而从v3.3.10版本开始,又变成了total - free - buff/cache。这就导致了同一个命令,在不同机器上显示的含义可能完全相反。
真正反映内存去向的,只有 /proc/meminfo 里的字段。它不是快照,而是内核实时维护的内存分类账本。运行:
cat /proc/meminfo
重点关注这些字段:
MemTotal:内核可支配的总物理内存(BIOS/固件/内核自身已扣减)MemA vailable:最该盯住的数字——内核估算的、可立即分配给新进程的内存,含可回收的 page cache、slab reclaimable 等AnonPages:匿名页(堆、栈、mmap 匿名映射),不能被简单丢弃,OOM 前必须 swap 或 kill 进程Shmem:tmpfs / shared memory 占用,计入 Cached 但属于“伪缓存”,实际是应用数据,不可回收Active(file) 和 Inactive(file):分别表示最近/不常访问的文件缓存页,后者更易回收Buffers:块设备 I/O 的底层缓冲(如 ext4 journal),现代内核中通常极小MemA vailable 看起来够用,但系统还是 OOM?查 Shmem 和 UnevictableMemA vailable 是启发式估算值,不是硬保证。它假设 Active(file)、Inactive(file)、SReclaimable 都能顺利回收,但以下情况会让它严重偏高:
Shmem 占用大:比如 /dev/shm 下塞了几个 GB 的共享内存段,或容器挂载了大 tmpfsUnevictable 内存存在:GPU 显存、mlock() 锁定的内存、某些驱动分配的不可换出页遇到 MemA vailable 还剩几百 MB 却频繁触发 OOM killer,立刻执行:
grep -i "shmem|unevictable" /proc/meminfo
find /dev/shm /run -type f -size +1M 2>/dev/null | head -5
cat /proc/meminfo | grep -E "(AnonHugePages|HugePages_)"
Cached 和 Buffers:一个管文件,一个管块设备很多人把两者都叫“缓存”,但它们来源和行为完全不同:
Buffers:仅用于块设备 I/O 的元数据和临时缓冲(如磁盘扇区对齐、ext4 journal),现代内核中通常小于 10MBCached:来自 VFS 层的 page cache,缓存的是文件内容本身;它包含 Active(file) + Inactive(file) + 部分 Shmem,绝大部分可被回收(除非被 mlock() 或标记为 Unevictable)注意:Cached 不等于 cat /proc/meminfo | awk '/^Cached:/ {print $2}' 的原始值——因为 Shmem 被重复计入了 Cached 和 Shmem 字段,直接相加会重复统计。
/proc/meminfo,别 parse free 输出free 的输出格式随版本和参数变化剧烈(列数、单位、是否含 shared、a vailable 是否存在),不适合写进监控脚本。而 /proc/meminfo 格式稳定、字段语义明确、无歧义。
例如,要获取当前可安全分配的内存(单位 KB):
awk '/^MemA vailable:/ {print $2}' /proc/meminfo要计算真正被进程“实打实”占用的内存(排除所有可回收项):
awk '/^MemTotal:/ {t=$2} /^MemFree:/ {f=$2} /^Buffers:/ {b=$2} /^Cached:/ {c=$2} /^SReclaimable:/ {s=$2} /^Shmem:/ {sh=$2} /^MemA vailable:/ {a=$2} END {print "AnonReal: " t-f-b-c+s+sh}' /proc/meminfo复杂点在于 Shmem 和 Unevictable 的干扰,它们让“可用”和“已用”的边界变得模糊——这恰恰是 Linux 内存管理的真实水平线,不是靠一个数字能概括的。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9