本文目录导读:

在脚本(通常是 Shell、Python 或监控脚本)中查看 Free 内存(即空闲内存)时,解读方式与直接看 free 命令输出不同,因为脚本通常只抓取某个特定数值。
为了正确解读脚本中的 Free 内存,核心观点是:不要只看 Mem: free 那一列,要看 Mem: available(如果支持)或手动计算“真实可用内存”。
下面是详细的解读指南:
脚本中常见的查看方式及误区
free -m | grep Mem | awk '{print $4}' (不推荐)
- 输出示例:
1500 - 单位:MB
- 解读误区:这个
1500是 “完全未被使用的内存”。 - 为什么不对? Linux 内核为了提升 I/O 性能,会用大量空闲内存作为缓存(Cache)和缓冲区(Buffer),这些内存在应用程序需要时可以随时被回收,所以这个
free值往往很低,会给你一种“内存快用完了”的错觉,但实际系统可能很流畅。
free -m | grep Mem | awk '{print $7}' (推荐)
- 输出示例:
7800 - 单位:MB
- 解读方法:这是
available列(Linux 3.14+ 内核引入)。 - 解读方法:这个值是 “在不触发严重交换(Swap)的情况下,新进程可以使用的内存的估算值”,它考虑了
free值 + 可回收的缓存/缓冲区。- 脚本报警阈值建议:当
available内存低于总内存的 10% 或 5%(根据业务重要性)时,触发告警。
- 脚本报警阈值建议:当
如何从脚本中获取最准确的“可用内存”
如果你的系统内核较老(不支持 available 列),或者使用的是 top、/proc/meminfo 等工具,你需要手动计算。
公式:
真实可用内存 ≈ MemFree + (Cached - Shmem) + Buffers
在 /proc/meminfo 中找对应字段(最准确,推荐脚本使用):
# 从 /proc/meminfo 中提取关键指标
MemTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}')
MemFree=$(grep MemFree /proc/meminfo | awk '{print $2}')
Cached=$(grep '^Cached:' /proc/meminfo | awk '{print $2}')
Buffers=$(grep Buffers /proc/meminfo | awk '{print $2}')
Shmem=$(grep Shmem /proc/meminfo | awk '{print $2}') # 共享内存,是Cached的一部分,但不可回收
# 计算真实可用内存 (单位: KB)
Available=$(( MemFree + Cached + Buffers - Shmem ))
echo "Available Memory: $Available KB"
解读脚本输出:
- 如果上述计算得到的
Available接近MemTotal,说明内存非常充裕。 Available很低(比如低于 500MB 或总内存的 5%),说明存在内存压力。
针对不同场景的解读
场景 A:监控与告警脚本
- 检查目标:
MemAvailable或上面计算出的Available。 - 解读标准:
Available < 总内存 * 10%:警告(Warning)。Available < 总内存 * 5%:严重告警(Critical),系统可能开始使用 Swap,性能下降。
- 不要设立:不要对
MemFree设立高告警阈值,否则服务器可能一直报警。
场景 B:排查内存泄漏
- 检查目标:看
Used的持续增长趋势。 - 解读方法:
- 如果脚本轮询显示
Used(总内存 -Available)缓慢但持续上升,且无下降(没有释放),即使Free列一直很低,也可能存在内存泄漏问题。 Available保持稳定,说明缓存工作正常。
- 如果脚本轮询显示
场景 C:判断是否需要增加物理内存
- 检查目标:看
Swap Used和Available。 - 解读方法:
- 如果脚本显示
Swap Used持续大于 0 且Available长期低于 20%,说明物理内存不足,需要扩容。 Swap Used为 0,即使Free列只有 100MB,只要Available充足(> 2GB),通常不需要加内存。
- 如果脚本显示
脚本示例(Bash)
#!/bin/bash
# 监控脚本示例
MEM_TOTAL=$(free -m | grep Mem | awk '{print $2}')
MEM_AVAIL=$(free -m | grep Mem | awk '{print $7}')
MEM_FREE=$(free -m | grep Mem | awk '{print $4}')
echo "总内存: ${MEM_TOTAL}MB"
echo "脚本通常查看的Free: ${MEM_FREE}MB (此值很低不代表有问题)"
echo "真实可用内存: ${MEM_AVAIL}MB (推荐用此值判断)"
# 告警逻辑
if [ "$MEM_AVAIL" -lt 500 ]; then
echo "严重警告: 可用内存不足500MB!"
elif [ "$MEM_AVAIL" -lt 1000 ]; then
echo "警告: 可用内存低于1000MB"
else
echo "内存状态正常"
fi
总结表
| 脚本中抓取的值 | 对应命令 | 含义 | 脚本解读建议 |
|---|---|---|---|
MemFree |
free -m 第4列 |
完全未使用的内存 | 不推荐作为主要告警指标,值很低很常见。 |
MemAvailable |
free -m 第7列 |
估算的可用内存 | 强烈推荐,这是新进程可用的、无需交换的内存量,是判断内存压力的最佳单一指标。 |
Active(anon) + Inactive(anon) |
/proc/meminfo |
真正被程序占用的匿名内存 | 用于排查内存泄漏,看趋势是否持续增长。 |
SwapTotal - SwapFree |
free -m |
已使用的交换分区 | 如果此值持续 > 0,并 且 MemAvailable 很低,说明物理内存不足。 |
一句话结论: 在脚本中解读内存时,忘记那个看起来很低的“Free”,找到 “available” 字段,用它来判断内存是否够用。