linux中应判断available内存是否低于总内存10%而非计算使用率;示例函数先读/proc/meminfo获取memtotal,若available为空则fallback用free提取,再比较并返回状态码。

Linux中不能直接用条件判断“内存使用率过高”,因为系统本身不提供一个现成的百分比数值供 if 直接比较——free 输出的 used 列含缓存,不能代表真实压力;真正有意义的是 available 内存量。所以检测逻辑应是:判断 available 内存是否低于安全阈值(比如总内存的10%),而不是计算“使用率”再比大小。
用 free + awk 提取 available 并做阈值判断
以下是一行可直接用于脚本的条件检测示例(以总内存的10%为警戒线):
if [ $(awk '/Mem:/ {avail=$7; total=$2; if (avail
说明:
-
/proc/meminfo是最准确、无格式干扰的数据源; -
Mem:行中第2列是MemTotal(单位 kB),第7列是MemAvailable(Linux 3.14+ 内核才支持,推荐使用); - 用
total*0.1计算出 10% 阈值,避免硬编码具体数值,适配不同服务器; - 该写法不依赖
free命令输出格式变化,更稳定。
兼容老内核:用 free -b + awk 模拟 available
若系统内核低于 3.14(MemAvailable 不存在),可用 free -b 输出估算可用内存:
if [ $(free -b | awk 'NR==2 {avail=; total=; if (avail
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
注意:
-
free -b输出第二行(Mem:)的第7列在新版free中即为available; - 旧版
free(如 RHEL6)不显示available,此时需退回到free -m+ 手动公式:available ≈ free + buffers + cached,但该值偏乐观,仅作粗略参考。
结合进程排查,避免误报
单看内存数字可能误判(比如大量 cache 占用但业务正常)。建议组合检查:
- 先确认
available确实偏低; - 再检查是否有单个进程 RSS 超过总内存 20%:
ps aux --sort=-rss | head -n 2 | tail -n 1 | awk '{print $6/1024/1024}'(RSS 单位 kB,转 GB); - 最后看 swap 是否在增长:
swapon --show=NAME,USED | grep -v USED,非零且上升说明物理内存已实质不足。
封装成可复用的检查函数
放入 shell 脚本中,便于定时任务或监控调用:
check_mem_high() {
local avail=$(awk '/MemAvailable:/ {print $2}' /proc/meminfo 2>/dev/null)
local total=$(awk '/MemTotal:/ {print $2}' /proc/meminfo)
if [ -z "$avail" ]; then avail=$(free -b | awk 'NR==2 {print $7}'); fi
if [ "$avail" -lt $((total / 10)) ]; then return 0; else return 1; fi
}
if check_mem_high; then echo "⚠️ 内存可用量低于10%"; fi
这个函数自动 fallback 到 free,兼容新老环境,返回标准 shell 状态码,可直接用于 if 判断。










