Linux free 命令深度解析:从内存查看小白到脚本高手的进阶指南
摘要:本文深入解析Linux系统free命令的使用技巧,从基础到高级应用全面覆盖。内容涵盖:基础语法与核心选项解析、内存数据解读指南(重点区分used/free/available)、高级监控技巧(持续刷新/时间戳记录/watch监控)、典型场景解决方案(定位高内存进程/应急释放缓存)以及自动化监控脚本实现。特别强调free命令与其他工具(如ps/awk)的配合使用,并提供了可直接部署的内存告警脚
作为 Linux 系统运维或开发人员,你是否遇到过 “系统变慢了,是内存不够吗?”“程序突然崩溃,怎么快速判断内存是否耗尽?” 这类问题?此时,free
命令就是你手边最直接的 “内存听诊器”—— 它能瞬间帮你摸清系统内存的 “家底”,但多数人只用过free -h
就以为掌握了全部。今天,我们从适用场景到脚本开发,全方位拆解free
命令,让你从 “会用” 变成 “用透”。
一、free 命令:解决哪些实际问题?(适用场景)
在 Linux 系统中,内存是 “兵家必争之地”—— 应用程序运行、系统缓存、进程调度都依赖内存。free
命令的核心作用是查看系统物理内存(RAM)和交换分区(Swap)的使用与空闲状态,其适用场景覆盖日常运维到应急排查:
- 系统健康日常巡检:每天上班第一件事,用
free -h
快速确认内存是否充足,避免因内存不足导致系统卡顿。 - 应用性能瓶颈排查:当 Web 服务(如 Nginx、Tomcat)响应变慢时,先查内存是否被占满(而非直接怀疑 CPU)—— 内存不足会导致大量 Swap 交换,拖慢整个系统。
- 程序异常定位:若程序突然退出且无明确日志,可先用
free
检查是否因内存耗尽被内核 “杀死”(OOM Killer)。 - 自动化监控基础:在 shell 脚本中调用
free
,提取内存数据并设置阈值告警(如内存可用量低于 1GB 时发提醒),实现无人值守监控。
二、5 分钟掌握:free 命令的基础语法与核心选项
free
命令的语法非常简洁,但不同选项决定了输出的 “可读性” 和 “维度”,先记住最核心的格式:
free [选项]
无需死记硬背,掌握以下 4 个高频选项,就能应对 90% 的基础场景:
选项 | 作用说明 | 实用场景 |
---|---|---|
无选项 | 默认以KB为单位输出内存数据,显示物理内存、Swap 分区详情 | 需精确数值时(如脚本计算),但可读性差 |
-h |
以 “人类可读” 格式输出(自动用 KB/MB/GB 单位) | 日常查看,一眼看懂内存占用(推荐首选) |
-m |
强制以MB为单位输出 | 需固定单位对比内存变化时(如脚本中数值判断) |
-s [秒数] |
持续刷新内存数据,间隔为指定秒数 | 观察内存实时变化(如排查内存泄漏) |
举个直观例子:刚接触时,直接输free
会看到满屏数字(KB 单位),比如 “Mem: 16384000 12000000 4384000 ...”,很难快速判断;但加-h
后,会变成 “Mem: 15.7Gi 11.5Gi 4.2Gi ...”,瞬间清晰。
三、从 “看懂” 到 “理解”:free 命令的基本使用方法
很多人用free
只看 “free” 列,误以为 “free 值小就是内存不够”—— 这是典型的误区。先从最常用的free -h
入手,彻底理解输出的每一列含义。
1. 执行free -h
,看懂输出结构
$ free -h
total used free shared buff/cache available
Mem: 16Gi 4Gi 6Gi 96Mi 6Gi 11.5Gi
Swap: 19Gi 0B 19Gi
输出分为两部分:Mem
(物理内存)和Swap
(交换分区,内存不足时临时 “借” 硬盘空间),核心列解读:
- total:总物理内存(16Gi)—— 系统从硬件识别到的总内存。
- used:实际被占用的内存(4Gi)—— 仅包含应用程序、系统内核直接使用的内存(不包括 buff/cache)。计算公式约为:
used = total - free - buff/cache
(4Gi = 16Gi - 6Gi - 6Gi)。 - free:完全空闲的内存(6Gi)—— 未被任何程序或缓存使用的内存。
- buff/cache:缓存区(6Gi)—— 系统为提升性能临时分配的内存(独立于
used
):buff
(写缓存):临时存储待写入硬盘的数据(如复制文件时)。cache
(读缓存):临时存储已读取的文件数据(如反复查看日志时)。- 这部分内存可被系统回收(当新程序需要内存时)。
- available:可用内存(11.5Gi)—— 最关键指标,约等于
free + 可回收的 buff/cache
(6Gi + 约 5.5Gi),代表系统能给新程序分配的内存。
2. 基础用法实战
- 快速看内存概况:
free -h
(首选,人类可读) - 固定 MB 单位对比:
free -m
(适合需要精确数值时,如 “可用内存是否低于 1024MB”) - 查看 Swap 分区详情:
free -h | grep Swap
(单独提取 Swap 行,避免干扰)
关键提醒:若available
内存低于总内存的 10%,才需要警惕内存不足;若只是free
小但buff/cache
大,说明系统在合理利用内存提升性能,无需担心。
四、进阶技巧:让 free 命令 “说话” 更精准(高级使用方法)
当基础查看满足不了需求(如排查内存泄漏、实时监控),这些高级用法能帮你 “挖得更深”。
1. 持续监控内存变化(排查内存泄漏)
若怀疑某程序有内存泄漏(如 Java 服务内存占用越来越高),用-s
选项持续刷新内存数据:
# 每2秒刷新一次,以人类可读格式输出,直到按Ctrl+C停止
free -s 2 -h
输出会不断刷新,观察used
列是否持续增长、available
是否持续减少 —— 若是的话,大概率存在内存泄漏,需进一步定位进程。
2. 加时间戳,记录内存变化节点
持续监控时,若想知道 “某时间点内存突然上涨”,可结合-t
(显示总和)和date
命令加时间戳:
# 每3秒刷新一次,输出时先显示当前时间
while true; do echo -n "$(date '+%Y-%m-%d %H:%M:%S'): "; free -h | grep Mem; sleep 3; done
输出效果如下,方便后续追溯问题时间点:
2024-05-20 14:30:00: Mem: 15Gi 1.3Gi 10Gi 128Mi 3.7Gi 12Gi
2024-05-20 14:30:03: Mem: 15Gi 1.5Gi 9Gi 128Mi 4.0Gi 11Gi
3. 用watch
实时监控,保持界面稳定
free -s
会不断输出新内容,导致屏幕滚动,用watch
命令可固定界面,只刷新数据:
# 每2秒刷新一次内存数据,界面固定,更易观察变化
watch -n 2 free -h
按Ctrl+C
可退出监控,适合长时间盯着内存变化的场景。
4. 查看 “真实可用内存” 的简化输出
free -w
的核心功能是拆分 buff/cache 为独立列,; “部分新 Linux 版本(如 CentOS 8、Ubuntu 20.04+ )支持 -w 选项” (需依赖较新的 procps-ng
工具集,主流新发行版均已包含):
free -wh # -w 宽格式,-h 人类可读单位
实际输出(以 Ubuntu 22.04 为例)
total used free shared buffers cache available
Mem: 16Gi 3.2Gi 7.8Gi 120Mi 450Mi 4.5Gi 12.2Gi
Swap: 19Gi 0B 19Gi
buffers/cache拆分输出了。
五、最佳实践:结合其他命令解决实际问题
free
命令本身只 “展示数据”,要解决问题,必须和其他命令搭配 —— 这才是运维的核心能力。
1. 场景 1:内存不足?快速定位高内存占用进程
当free -h
发现available
内存低于阈值(如 1GB),下一步就是找 “内存小偷”:
# 步骤1:先用free确认内存紧张
free -h # 假设输出available: 800Mi
# 步骤2:用ps命令按内存占用排序,取前10个进程
ps aux --sort=-%mem | head -10
ps aux
中的%mem
列代表进程占用的物理内存百分比,排序后能快速找到 “元凶”。比如输出中若看到:
root 1234 2.0 15.0 1234560 245600 ? Ssl 10:00 0:30 /usr/bin/java -jar app.jar
说明 Java 进程占用了 15% 的内存(约 2.3Gi),需进一步检查该应用是否存在内存溢出(如查看 JVM 日志)。
2. 场景 2:应急处理:临时释放缓存内存
若buff/cache
占用过高(如超过 50%),且available
不足,可临时清理缓存(注意:缓存是提升性能的,清理后需重新加载,仅应急用):
# 步骤1:确认缓存占用高
free -h # 假设buff/cache: 8Gi,available: 500Mi
# 步骤2:清理page cache(需root权限)
sudo su
echo 1 > /proc/sys/vm/drop_caches
# 步骤3:再次查看,缓存已释放
free -h # 此时buff/cache可能降至1Gi左右,available提升
注意:这只是临时方案,若缓存很快又涨满,需排查是否有程序频繁读写大文件(如日志写入、数据备份),而非反复清理缓存。
3. 场景 3:自动化监控的基础:提取内存数据
在脚本中,需从free
输出中提取指定数值(如available
内存),用awk
命令即可实现:
# 提取物理内存的available值(单位:MB)
available_mem=$(free -m | awk '/Mem:/ {print $7}')
echo "当前可用内存:$available_mem MB"
输出:当前可用内存:12500 MB
—— 这是后续写监控脚本的核心步骤。
六、实战脚本:用 free 命令做 “内存告警机器人”
学会了基础和进阶用法,最终要落地到自动化 —— 下面这个脚本可实现 “内存低于阈值时自动告警”,适合部署到生产环境。
脚本功能
- 每 5 分钟检查一次系统可用内存(可修改)
- 若可用内存低于 1024MB(1GB,可调整阈值),则记录告警日志
- (可选)发送邮件给运维人员
脚本代码(mem_monitor.sh)
#!/bin/bash
# 系统内存监控告警脚本
# 功能:可用内存低于阈值时记录日志并告警
# 1. 配置参数(可根据需求修改)
THRESHOLD=1024 # 告警阈值(单位:MB)
LOG_FILE="/var/log/mem_monitor.log" # 日志文件路径
EMAIL="admin@example.com" # 接收告警的邮箱(可选)
# 2. 提取当前可用内存(MB)
available_mem=$(free -m | awk '/^Mem:/ {print $7}')
# 提取当前时间
current_time=$(date '+%Y-%m-%d %H:%M:%S')
# 3. 检查内存提取是否成功
if ! [[ "$available_mem" =~ ^[0-9]+$ ]]; then
echo "[$current_time] 错误:无法获取可用内存数据" >> "$LOG_FILE"
echo "[$current_time] 错误:无法获取可用内存数据"
exit 1
fi
# 4. 判断是否低于阈值
if [ "$available_mem" -lt "$THRESHOLD" ]; then
# 4.1 记录告警日志(使用英文变量名避免兼容性问题)
alert_msg="[$current_time] 警告:系统可用内存过低!当前可用:${available_mem} MB,阈值:${THRESHOLD} MB"
echo "$alert_msg" >> "$LOG_FILE"
# 4.2 (可选)发送邮件告警(需先安装mailutils工具并配置邮件服务)
# echo "$alert_msg" | mail -s "Linux内存告警" "$EMAIL"
# 4.3 输出到控制台(红色字体提示)
echo -e "\033[31m$alert_msg\033[0m"
else
# 4.4 正常情况记录日志
normal_msg="[$current_time] 系统内存正常,当前可用:${available_mem} MB"
echo "$normal_msg" >> "$LOG_FILE"
echo "$normal_msg"
fi
脚本使用步骤
- 保存脚本:将上述代码保存为
mem_monitor.sh
,放在/root/
目录下。 - 添加执行权限:
chmod +x /root/mem_monitor.sh
- 测试脚本:
/root/mem_monitor.sh
若内存正常,会输出 “系统内存正常”;若低于 1024MB,会显示红色告警。
- 设置定时执行(crontab):
# 编辑crontab,每5分钟执行一次 crontab -e # 添加以下内容(保存退出) */5 * * * * /root/mem_monitor.sh
- 查看日志:
cat /var/log/mem_monitor.log
脚本验证
若想测试告警功能,可临时降低阈值(如THRESHOLD=20000
,假设你的内存不足 20GB),执行脚本后会看到日志和告警,确保脚本正常运行。
总结:free 命令的 “从浅到深” 之路
free
命令看似简单,却藏着 Linux 内存管理的核心逻辑 —— 从 “看懂 available 列” 到 “结合脚本做自动化监控”,每一步都是运维能力的提升:
- 基础层:记住
free -h
,分清used/free/available
,避免被 “free 小” 误导。 - 进阶层:用
-s
持续监控、watch
固定界面、awk
提取数据,满足排查需求。 - 实战层:搭配
ps
定位高内存进程、echo 1 > /proc/sys/vm/drop_caches
应急清理、写脚本自动化告警,解决实际问题。
最后提醒:free
只是 “起点”,若想深入内存优化,还需学习vmstat
(内存与 IO 关联)、top
(进程内存详情)等命令,但掌握free
,就等于打通了 Linux 内存管理的 “第一关”。
更多推荐
所有评论(0)