/proc/meminfo 是唯一准确反映内存去向的来源,free 的 used 列语义混乱;应重点关注 MemA vailable、AnonPages、Shmem、Active/Inactive(file)、Buffers 等字段,避免误判内存占用。

Linux怎么查看具体的内存使用分类

别信 free 的 used 行,直接看 /proc/meminfo

在Linux系统中,想知道内存“被谁占了”,通过free命令输出的used列可没办法搞清楚。为啥呢?因为这个列在不同的内核版本里,含义根本不一样。在free v3.2.8版本中,它是total - free;而从v3.3.10版本开始,又变成了total - free - buff/cache。这就导致了同一个命令,在不同机器上显示的含义可能完全相反。

真正反映内存去向的,只有 /proc/meminfo 里的字段。它不是快照,而是内核实时维护的内存分类账本。运行:

cat /proc/meminfo

重点关注这些字段:

MemA vailable 看起来够用,但系统还是 OOM?查 ShmemUnevictable

MemA vailable 是启发式估算值,不是硬保证。它假设 Active(file)Inactive(file)SReclaimable 都能顺利回收,但以下情况会让它严重偏高:

遇到 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_)"

区分 CachedBuffers:一个管文件,一个管块设备

很多人把两者都叫“缓存”,但它们来源和行为完全不同:

注意:Cached 不等于 cat /proc/meminfo | awk '/^Cached:/ {print $2}' 的原始值——因为 Shmem 被重复计入了 CachedShmem 字段,直接相加会重复统计。

想脚本化分析?优先解析 /proc/meminfo,别 parse free 输出

free 的输出格式随版本和参数变化剧烈(列数、单位、是否含 shareda 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

复杂点在于 ShmemUnevictable 的干扰,它们让“可用”和“已用”的边界变得模糊——这恰恰是 Linux 内存管理的真实水平线,不是靠一个数字能概括的。

本文转载于:https://www.php.cn/faq/3024287.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。