Skip to content

free 命令:内存使用情况分析的得力助手

1. 命令简介

free 是一个重要的 Linux 命令行工具,用于显示系统中可用和已用的物理内存及交换内存(swap space)的总量。它从 /proc/meminfo 文件中读取信息,提供了一个快速查看系统内存使用状况的方法。对于系统管理员和开发人员来说,这是一个监控系统资源、诊断内存相关问题的关键工具。

2. 基本语法

bash
free [选项]

3. 常用选项详解

  • -h--human: 以人类可读的格式显示大小(如 B, K, M, G)
  • -b, -k, -m, -g: 分别以 Bytes, KB, MB, GB 为单位显示
  • -s N--seconds N: 每 N 秒重复显示一次
  • -c N--count N: 重复显示 N 次后退出
  • -w--wide: 宽输出模式
  • -t--total: 显示内存总和的行
  • --si: 使用 1000 而不是 1024 作为进位的基数

4. 基础用法示例

4.1 显示系统内存使用情况

bash
free -h

输出示例:

               total        used        free      shared  buff/cache   available
Mem:           15Gi       4.7Gi       5.8Gi       1.1Gi       4.9Gi        9.0Gi
Swap:          2.0Gi          0B       2.0Gi

4.2 以兆字节为单位显示内存使用情况

bash
free -m

输出示例:

               total        used        free      shared  buff/cache   available
Mem:           16024        4815        5942        1129        5266        9248
Swap:           2048           0        2048

4.3 每 5 秒更新一次内存使用情况,共显示 3 次

bash
free -h -s 5 -c 3

5. 高级用法和技巧

5.1 显示详细的内存统计信息

bash
free -w

这会显示一个额外的 "available" 列,表示可用于启动新应用的估计内存量。

5.2 计算实际使用的内存百分比

bash
free | grep Mem | awk '{print $3/$2 * 100.0}'

这将输出实际使用的内存百分比。

5.3 监控内存使用变化

bash
watch -n 1 free -m

这将每秒更新一次内存使用情况。

6. 实际应用场景

6.1 内存使用监控脚本

bash
#!/bin/bash
# memory_monitor.sh

THRESHOLD=80  # 设置内存使用阈值为 80%
LOG_FILE="/var/log/memory_usage.log"

while true; do
    MEMORY_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    DATE=$(date +"%Y-%m-%d %H:%M:%S")
    
    echo "$DATE - Memory Usage: $MEMORY_USAGE%" >> $LOG_FILE
    
    if (( $(echo "$MEMORY_USAGE > $THRESHOLD" | bc -l) )); then
        echo "$DATE - WARNING: Memory usage exceeded $THRESHOLD%" >> $LOG_FILE
        # 在这里可以添加告警逻辑,如发送邮件或执行其他操作
    fi
    
    sleep 300  # 每 5 分钟检查一次
done

这个脚本持续监控内存使用情况,当使用率超过阈值时记录警告信息。

6.2 系统资源报告生成器

bash
#!/bin/bash
# system_resource_report.sh

REPORT_FILE="system_resource_report_$(date +%Y%m%d).txt"

echo "System Resource Report - $(date)" > $REPORT_FILE
echo "=======================================" >> $REPORT_FILE

echo -e "\nMemory Usage:" >> $REPORT_FILE
free -h >> $REPORT_FILE

echo -e "\nTop 5 Memory-Consuming Processes:" >> $REPORT_FILE
ps aux --sort=-%mem | head -n 6 >> $REPORT_FILE

echo -e "\nSwap Usage:" >> $REPORT_FILE
swapon --show >> $REPORT_FILE

echo -e "\nAvailable Memory Over Time:" >> $REPORT_FILE
for i in {1..5}; do
    free -h | grep Mem | awk '{print $7}' >> $REPORT_FILE
    sleep 2
done

echo "Report generated: $REPORT_FILE"

这个脚本生成一个系统资源报告,包括内存使用情况、最耗内存的进程和交换空间使用情况。

7. 性能考虑

  • free 命令本身对系统性能影响很小,可以频繁运行。
  • 但是,过于频繁地记录或分析 free 的输出可能会导致不必要的 I/O 操作。
  • 在大型系统上,考虑使用更高级的监控工具来补充 free 命令。

8. 安全注意事项

  • free 命令不会直接影响系统安全,但它显示的信息可能被用于系统指纹识别。
  • 在多用户系统中,普通用户也可以使用 free 命令,这通常不会造成安全问题。
  • 在生产环境中,避免在公开可见的脚本中硬编码内存使用阈值等敏感信息。

9. 与其他工具的集成

  • tophtop 结合使用可以获得更全面的系统资源使用视图。
  • 可以与 sar (System Activity Reporter) 结合使用来长期监控系统性能。
  • 在 shell 脚本中,经常与 awkgrep 等命令一起使用来提取特定信息。

10. 故障排除

  • 如果 free 命令显示的可用内存很少,但系统似乎运行正常,可能是因为 Linux 内核会将未使用的内存用作磁盘缓存。
  • 在虚拟化环境中,free 显示的信息可能不完全准确,因为虚拟化可能会影响内存报告。
  • 如果 free 命令无法运行,检查 /proc/meminfo 文件是否存在和可读。

11. 相关命令

  • top: 提供实时的系统资源使用情况
  • vmstat: 报告虚拟内存统计信息
  • ps: 报告当前进程状态
  • swapon: 显示交换空间使用情况
  • /proc/meminfo: 包含详细的内存使用信息的文件

通过深入理解和灵活运用 free 命令,系统管理员和开发人员可以更好地监控和管理系统内存资源,及时发现潜在的内存问题,优化系统性能。