linux free命令

free命令用于显示系统内存使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。它是监控系统内存使用的重要工具。

语法格式

free [选项]

命令功能

  • 显示系统内存总量、已使用量和空闲量
  • 显示交换分区(swap)的使用情况
  • 显示缓冲区和缓存的内存使用情况
  • 以不同单位(KB、MB、GB等)显示内存信息
  • 连续监控内存变化

📝 重要说明

  • Linux系统会尽可能利用空闲内存作为磁盘缓存,以提高系统性能
  • available字段表示可用于启动新应用程序的内存,不包括交换分区
  • 交换分区使用过多可能表示物理内存不足
  • 内存信息从/proc/meminfo文件中读取

内存字段说明

字段 说明
total 总内存量(物理内存或交换分区)
used 已使用的内存量(包含buffers/cache)
free 完全空闲的内存
shared 被多个进程共享的内存(主要是tmpfs)
buff/cache 被内核缓冲区(buffer)和页面缓存(cache)使用的内存
available 估算的可用内存(可用于启动新应用程序,无需使用swap)

参数说明

参数 说明
-b, --bytes 以字节为单位显示内存
-k, --kilo 以KB为单位显示内存(默认)
-m, --mega 以MB为单位显示内存
-g, --giga 以GB为单位显示内存
--tera 以TB为单位显示内存
-h, --human 以人类可读的格式显示(自动选择合适的单位)
-w, --wide 宽输出模式,将buff/cache拆分为单独的buffers和cache列
-c, --count 次数 显示指定次数后退出,需与-s参数一起使用
-s, --seconds 秒数 连续显示,每间隔指定秒数刷新一次
--si 使用1000的幂而不是1024的幂(KB、MB、GB等)
-t, --total 显示总计行(物理内存+交换分区)
--help 显示帮助信息
-V, --version 显示版本信息

常用示例

示例1:基本用法 - 默认显示

不带任何参数使用free命令:

$ free
               total        used        free      shared  buff/cache   available
Mem:        8168900     3123456      876543      123456     4168900     4523456
Swap:       2097148           0     2097148

输出解释:

  • Mem行:物理内存信息
    • total:8,168,900 KB(约7.8 GB)
    • used:3,123,456 KB 已使用
    • free:876,543 KB 完全空闲
    • buff/cache:4,168,900 KB 用于缓冲和缓存
    • available:4,523,456 KB 可用内存
  • Swap行:交换分区信息
    • total:2,097,148 KB(约2 GB)
    • used:0 KB 已使用
    • free:2,097,148 KB 空闲

示例2:人类可读格式

使用-h参数以易读的格式显示:

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       3.0Gi       857Mi       120Mi       4.0Gi       4.3Gi
Swap:          2.0Gi          0B       2.0Gi

示例3:指定显示单位

使用不同单位显示内存信息:

# 以MB为单位
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            7981        3051         856         120        4074        4418
Swap:           2047           0        2047

# 以GB为单位
$ free -g
               total        used        free      shared  buff/cache   available
Mem:               7           2           0           0           3           4
Swap:              1           0           1

# 以字节为单位
$ free -b
               total        used        free      shared  buff/cache   available
Mem:    8364968960  3200000000   897000000   123000000  4267968960  4630000000
Swap:   2147479552           0  2147479552

示例4:宽输出模式

使用-w参数将buff/cache拆分为buffers和cache:

$ free -w
               total        used        free      shared     buffers       cache   available
Mem:        8168900     3123456      876543      123456      123456     4045444     4523456
Swap:       2097148           0     2097148

示例5:显示总计行

使用-t参数显示物理内存和交换分区的总计:

$ free -h -t
               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       3.0Gi       857Mi       120Mi       4.0Gi       4.3Gi
Swap:          2.0Gi          0B       2.0Gi
Total:         9.8Gi       3.0Gi       2.8Gi

示例6:连续监控内存

使用-s参数连续监控内存使用情况:

# 每2秒刷新一次
$ free -s 2

# 每5秒刷新,共显示5次
$ free -s 5 -c 5

# 人类可读格式连续监控
$ free -h -s 3

示例7:结合watch命令实时监控

使用watch命令实现更灵活的监控:

# 每2秒刷新free命令
$ watch -n 2 free -h

# 带时间戳的监控
$ watch -n 1 'echo "=== $(date) ==="; free -h'

# 监控特定指标
$ watch -n 1 'free -h | grep -A1 "Mem:"'

示例8:分析内存使用趋势

使用脚本记录内存使用情况:

#!/bin/bash

# 记录内存使用情况到文件
LOG_FILE="memory_usage.log"

echo "时间戳,总内存,已使用,空闲,共享,buff/cache,可用,总swap,已用swap,空闲swap" > "$LOG_FILE"

while true; do
    # 获取内存信息
    mem_info=$(free -k | grep -E "Mem:|Swap:")

    # 提取数据
    mem_line=$(echo "$mem_info" | grep "Mem:")
    swap_line=$(echo "$mem_info" | grep "Swap:")

    mem_total=$(echo "$mem_line" | awk '{print $2}')
    mem_used=$(echo "$mem_line" | awk '{print $3}')
    mem_free=$(echo "$mem_line" | awk '{print $4}')
    mem_shared=$(echo "$mem_line" | awk '{print $5}')
    mem_buffcache=$(echo "$mem_line" | awk '{print $6}')
    mem_available=$(echo "$mem_line" | awk '{print $7}')

    swap_total=$(echo "$swap_line" | awk '{print $2}')
    swap_used=$(echo "$swap_line" | awk '{print $3}')
    swap_free=$(echo "$swap_line" | awk '{print $4}')

    # 记录到日志文件
    echo "$(date '+%Y-%m-%d %H:%M:%S'),$mem_total,$mem_used,$mem_free,$mem_shared,$mem_buffcache,$mem_available,$swap_total,$swap_used,$swap_free" >> "$LOG_FILE"

    sleep 60  # 每分钟记录一次
done

示例9:检查内存泄漏

监控特定进程的内存使用增长:

#!/bin/bash

# 监控内存使用增长
echo "开始监控内存使用情况..."
echo "时间,可用内存,已用swap"

while true; do
    available_mem=$(free -m | grep Mem | awk '{print $7}')
    used_swap=$(free -m | grep Swap | awk '{print $3}')
    echo "$(date '+%H:%M:%S'),${available_mem}MB,${used_swap}MB"

    # 如果可用内存过少或swap使用过多,发出警告
    if [ "$available_mem" -lt 100 ]; then
        echo "警告:可用内存不足100MB!"
    fi

    if [ "$used_swap" -gt 100 ]; then
        echo "警告:swap使用超过100MB!"
    fi

    sleep 30
done

⚠️ 内存使用注意事项

  1. 缓存不是内存占用:Linux会利用空闲内存作为磁盘缓存,这有助于提高性能,不是内存泄漏
  2. 关注available字段availablefree更能反映实际可用内存
  3. swap使用过多:大量使用swap可能表示物理内存不足,会影响性能
  4. 内存泄露检测:如果available持续减少且buff/cache没有相应减少,可能存在内存泄露
  5. OOM Killer:当内存严重不足时,Linux的OOM Killer会终止占用内存最多的进程

💡 内存优化技巧

  1. 清理缓存:可以清理页面缓存,但通常不需要
    # 清理页面缓存(谨慎使用)
    echo 1 > /proc/sys/vm/drop_caches
    
    # 清理目录项和inode缓存
    echo 2 > /proc/sys/vm/drop_caches
    
    # 清理页面缓存、目录项和inode
    echo 3 > /proc/sys/vm/drop_caches
  2. 监控工具:结合tophtopvmstat等工具全面监控
  3. 调整swapiness:调整系统使用swap的倾向
    # 查看当前值(0-100,越高越倾向使用swap)
    cat /proc/sys/vm/swappiness
    
    # 临时修改
    sudo sysctl vm.swappiness=10
    
    # 永久修改
    echo "vm.swappiness=10" >> /etc/sysctl.conf
    sudo sysctl -p

常见问题

Q: free命令显示的used为什么包含buff/cache?

A: 这是free命令的默认计算方式。buff/cache内存可以被释放用于新程序,所以Linux统计used时包含了这部分内存。

Q: available和free有什么区别?

A: free是完全空闲的内存,available是估算的可用于新程序的内存(包括部分可回收的缓存)。

Q: 为什么swap显示为0但仍然有性能问题?

A: 可能是内存碎片或内存带宽限制导致的。使用vmstatsar进一步诊断。

Q: 如何查看哪个进程占用内存最多?

A: 使用top命令按内存排序(按M键),或使用ps aux --sort=-%mem | head

Q: free命令的信息从哪里来?

A: 从/proc/meminfo文件读取。可以直接查看该文件获取更详细的内存信息。

相关命令

  • top - 动态显示进程和系统资源使用情况
  • htop - top的增强版,交互性更好
  • vmstat - 报告虚拟内存统计信息
  • ps - 显示进程状态
  • sar - 系统活动报告器
  • smem - 报告内存使用情况
  • cat /proc/meminfo - 查看详细内存信息