85·系统监控与调优入门

free、uptime 与负载监控

freeuptimeload

第85课 - free、uptime 与负载监控

学习目标

通过本节课的学习,你将能够:

  1. 使用 free 命令准确查看系统内存使用情况,理解关键字段含义。
  2. 使用 uptime 命令获取系统运行时间和系统负载平均值。
  3. 利用 tophtop 命令进行实时的系统资源监控与进程管理。

核心概念

1. 内存监控:free 命令

free 是最直接的内存使用情况查看工具。它读取 /proc/meminfo 文件,向你展示物理内存(RAM)和交换空间(Swap)的使用概况。 关键要记住的是“available”列,它表示可供新进程立即使用的内存大小(估算值),比“free”列(完全空闲的内存)更有参考价值。

2. 运行时间与负载:uptime 命令

uptime 是一个非常简洁的工具,通常输出一行信息,包含:

  • 系统当前时间
  • 系统已运行时长(多长时间没有重启了)
  • 当前登录的用户数
  • 过去1分钟、5分钟、15分钟的系统负载平均值

什么是负载平均值? 它表示处于“可运行状态”(等待CPU)或“不可中断睡眠状态”(等待磁盘I/O)的平均进程数。 一个粗略的理解:在单核CPU上,负载为1.0表示CPU刚好满负荷;负载超过1.0意味着有任务在排队。对于多核CPU,总负载是核心数的倍数时才满载(例如,4核CPU,负载4.0才满载)。

3. 实时监控:top 命令

top 提供了一个动态的、实时更新的视图,类似于Windows的任务管理器。它显示:

  • 系统整体信息(运行时间、负载、CPU、内存、交换空间)
  • 按资源占用排序的进程列表

你还可以在 top 运行时按 1 键来查看每个CPU核心的使用情况。

代码示例

示例1:使用 free 查看内存(可读格式)

# -h 选项使输出更易读(Human-readable)
free -h

预期输出示例:

              total        used        free      shared  buff/cache   available
Mem:          7.7Gi       3.2Gi       1.1Gi       256Mi       3.4Gi       4.0Gi
Swap:         2.0Gi          0B       2.0Gi

注释解读:

  • total:物理内存总量。
  • used:已被使用的内存(包括被应用和系统核心占用的)。
  • free:完全空闲,未被任何程序使用的内存。
  • shared:被共享内存使用的部分。
  • buff/cache:内核用作缓冲和缓存的内存。这部分内存可以在需要时快速释放给应用程序,因此也属于“可用”内存。
  • available重点! 预计可用于启动新应用程序的内存,不需要交换空间。

示例2:使用 uptime 检查运行时间和负载

uptime

预期输出示例:

 14:35:27 up 15 days, 4:23, 2 users, load average: 0.15, 0.20, 0.18

注释解读:

  • up 15 days, 4:23:系统已连续运行15天4小时23分钟。
  • 2 users:当前有2个登录会话。
  • load average: 0.15, 0.20, 0.18:过去1、5、15分钟的平均负载分别为0.15、0.20、0.18。对于一台现代多核服务器,这个负载很低。

示例3:使用 top 进行实时监控

# 直接启动 top
top

top 交互界面中,你经常会用到:

  • q:退出
  • M:按内存使用率排序
  • P:按CPU使用率排序(默认)
  • 1:显示/隐藏所有CPU核心的详细信息
  • h:显示帮助

实践练习

练习1:基础查询

查看你当前服务器的内存使用情况,并回答:available 内存有多少?交换空间使用了多少? 预期输出: 直接运行 free -h 并读取对应数值。

练习2:组合信息

使用一条命令(通过管道符 | 或分号 ;)同时输出当前系统的内存摘要(free -h)和运行时间与负载(uptime)。 预期输出: 命令 free -h; uptime 应会连续输出两个命令的结果。

练习3:脚本化负载检查

编写一个简单的 Bash 脚本 check_load.sh,它的功能是:

  1. 打印当前时间。
  2. 打印系统负载(从 uptime 的输出中提取)。
  3. 如果1分钟平均负载大于2.0,则输出警告信息。
#!/bin/bash
# check_load.sh - 一个简单的负载检查脚本

# 打印当前时间
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"

# 提取并打印1分钟平均负载
# awk 用于处理字符串,这里提取 uptime 输出中 load average 后的第一个数字
LOAD_1MIN=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' ')
echo "当前1分钟平均负载: $LOAD_1MIN"

# 使用 awk 进行数值比较
WARNING_LEVEL=2.0
if awk "BEGIN {exit !($LOAD_1MIN > $WARNING_LEVEL)}"; then
    echo "⚠️ 警告: 系统负载过高!"
else
    echo "✅ 系统负载正常。"
fi

运行方式:

chmod +x check_load.sh
./check_load.sh

常见错误

  1. 只看 free 列,忽略 available:初学者看到 free 数值很小就认为内存不足。实际上,Linux 会积极使用空闲内存作为缓存(buff/cache)来提升性能,这部分内存在需要时可以立即释放。available 才是判断内存是否紧张的关键指标。

  2. 误解负载平均值:认为负载必须低于1.0才是好的。负载的“正常”范围取决于你的 CPU 核心数和工作负载类型。在4核服务器上,4.0的负载是满载;而在一个经常处理大量I/O(如数据库)的服务器上,较高的负载可能是正常的。

  3. top 中迷失:进入 top 界面后不知道如何操作,只能强制关闭终端。记住最常用的键:q 退出,P 看CPU,M 看内存,1 看所有CPU核心。

  4. 混淆 usedavailable 内存的关系total = used + free + buff/cache。而 available ≈ free + buff/cache(这部分缓存可以被快速回收)。

小结

  • 内存监控看 free -h:重点关注 available 列,它比 free 列更能反映系统真实的可用内存状况。
  • 快速健康检查用 uptime:一行命令就能告诉你系统跑了多久、有几个用户、以及过去的负载趋势。负载值需要结合你的CPU核心数来解读。
  • 实时动态分析用 top:它是定位高资源消耗进程(CPU或内存大户)的利器。掌握几个基本的排序快捷键(P, M, 1)就能高效使用。
  • 这三个命令是系统管理员日常快速诊断的“听诊器”,熟练掌握它们是进行更深入系统监控和调优的基础。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「日志管理与 logrotate」 以巩固所学知识。