真实内存使用率=(MemTotal−MemAvailable)/MemTotal×100%,需用free -h的total和available手动计算,因available反映可立即分配内存,而top/htop的used含可回收缓存,易误判。

直接看 free -h 输出里的 available 和 used,再手动算百分比——这是唯一可靠的方式。其他工具(比如 top 顶部的 Mem 行)显示的 “used” 包含缓存,不能代表真实压力。
为什么不能直接信 top 或 htop 顶部的内存使用率?
top 命令顶部显示的 Mem: xxx used 是 MemTotal - MemFree,没扣掉 Buffers 和 Cached。Linux 内核会把空闲内存自动用于文件缓存,这部分内存可随时回收,不构成实际压力。误把缓存当“已用”,容易判断错误。
-
free -h的used列 =MemTotal - MemFree - Buffers - Cached - SReclaimable(近似),但依然偏高 -
free -h的available列才是关键:它基于内核估算,表示“此刻能立刻分配给新进程的物理内存” - 真正有意义的内存使用率 =
(MemTotal - MemAvailable) / MemTotal * 100%,不是used / total
怎么快速算出真实内存使用率?
别依赖图形化工具或自动百分比显示——它们逻辑不统一,有的按 used/total,有的按 (total - available)/total,结果差 20%+ 很常见。自己算最稳:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 运行
free -h,记下Mem行的total和available值(单位要一致,都用 GB 或都用 MB) - 用计算器或 shell 一行算:
echo "scale=1; (15.6 - 7.4) / 15.6 * 100" | bc(假设 total=15.6Gi, available=7.4Gi)→ 输出约 52.6% - 如果脚本里要用,推荐
awk提取:free -h | awk '/^Mem:/ {printf "%.1f%%\n", (1 - $7/$2) * 100}'($7是available,$2是total)
哪些场景下这个百分比会失真?
单纯一个百分比数字,在以下情况几乎没参考价值:
- 系统刚启动不久,
available还没被缓存填满,数值虚高 → 算出来使用率偏低 - 运行大量 mmap 映射或 hugepage 应用(如数据库),
MemAvailable估算不准,/proc/meminfo中的MemAvailable可能远低于实际可回收量 - Swap 已开始使用(
Swap:行used > 0),说明物理内存确实紧张,此时即使available还剩 1GB,也要警惕 - 容器环境(如 Docker/Podman)中,cgroup memory limit 限制了进程可用内存,
free显示的是宿主机全局值,和容器内感知完全不同
真正该盯住的不是“用了多少%”,而是 available 绝对值是否持续低于业务水位线(比如 Java 应用建议保留 ≥2GB),以及 Swap 是否活跃、vmstat 1 5 中的 si/so 是否非零——这些比一个百分比更能说明问题。

















