脚本中Free内存查看如何解读

wen 实用脚本 15

本文目录导读:

脚本中Free内存查看如何解读

  1. 脚本中常见的查看方式及误区
  2. 如何从脚本中获取最准确的“可用内存”
  3. 针对不同场景的解读
  4. 脚本示例(Bash)
  5. 总结表

在脚本(通常是 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 UsedAvailable
  • 解读方法
    • 如果脚本显示 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” 字段,用它来判断内存是否够用。

抱歉,评论功能暂时关闭!