作为 Linux 系统运维或开发人员,你是否遇到过 “系统变慢了,是内存不够吗?”“程序突然崩溃,怎么快速判断内存是否耗尽?” 这类问题?此时,free命令就是你手边最直接的 “内存听诊器”—— 它能瞬间帮你摸清系统内存的 “家底”,但多数人只用过free -h就以为掌握了全部。今天,我们从适用场景到脚本开发,全方位拆解free命令,让你从 “会用” 变成 “用透”。

一、free 命令:解决哪些实际问题?(适用场景)

在 Linux 系统中,内存是 “兵家必争之地”—— 应用程序运行、系统缓存、进程调度都依赖内存。free命令的核心作用是查看系统物理内存(RAM)和交换分区(Swap)的使用与空闲状态,其适用场景覆盖日常运维到应急排查:

  1. 系统健康日常巡检:每天上班第一件事,用free -h快速确认内存是否充足,避免因内存不足导致系统卡顿。
  2. 应用性能瓶颈排查:当 Web 服务(如 Nginx、Tomcat)响应变慢时,先查内存是否被占满(而非直接怀疑 CPU)—— 内存不足会导致大量 Swap 交换,拖慢整个系统。
  3. 程序异常定位:若程序突然退出且无明确日志,可先用free检查是否因内存耗尽被内核 “杀死”(OOM Killer)。
  4. 自动化监控基础:在 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 命令做 “内存告警机器人”

学会了基础和进阶用法,最终要落地到自动化 —— 下面这个脚本可实现 “内存低于阈值时自动告警”,适合部署到生产环境。

脚本功能

  1. 每 5 分钟检查一次系统可用内存(可修改)
  2. 若可用内存低于 1024MB(1GB,可调整阈值),则记录告警日志
  3. (可选)发送邮件给运维人员

脚本代码(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

脚本使用步骤

  1. 保存脚本:将上述代码保存为mem_monitor.sh,放在/root/目录下。
  2. 添加执行权限
        
        
        
      chmod +x /root/mem_monitor.sh
  3. 测试脚本
        
        
        
      /root/mem_monitor.sh

    若内存正常,会输出 “系统内存正常”;若低于 1024MB,会显示红色告警。

  4. 设置定时执行(crontab)
        
        
        
      # 编辑crontab,每5分钟执行一次
    crontab -e
    # 添加以下内容(保存退出)
    */5 * * * * /root/mem_monitor.sh
  5. 查看日志
        
        
        
      cat /var/log/mem_monitor.log

脚本验证

若想测试告警功能,可临时降低阈值(如THRESHOLD=20000,假设你的内存不足 20GB),执行脚本后会看到日志和告警,确保脚本正常运行。

总结:free 命令的 “从浅到深” 之路

free命令看似简单,却藏着 Linux 内存管理的核心逻辑 —— 从 “看懂 available 列” 到 “结合脚本做自动化监控”,每一步都是运维能力的提升:

  1. 基础层:记住free -h,分清used/free/available,避免被 “free 小” 误导。
  2. 进阶层:用-s持续监控、watch固定界面、awk提取数据,满足排查需求。
  3. 实战层:搭配ps定位高内存进程、echo 1 > /proc/sys/vm/drop_caches应急清理、写脚本自动化告警,解决实际问题。




    最后提醒:free只是 “起点”,若想深入内存优化,还需学习vmstat(内存与 IO 关联)、top(进程内存详情)等命令,但掌握free,就等于打通了 Linux 内存管理的 “第一关”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐