第85课 - free、uptime 与负载监控
学习目标
通过本节课的学习,你将能够:
- 使用
free命令准确查看系统内存使用情况,理解关键字段含义。 - 使用
uptime命令获取系统运行时间和系统负载平均值。 - 利用
top或htop命令进行实时的系统资源监控与进程管理。
核心概念
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,它的功能是:
- 打印当前时间。
- 打印系统负载(从
uptime的输出中提取)。 - 如果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
常见错误
-
只看
free列,忽略available:初学者看到free数值很小就认为内存不足。实际上,Linux 会积极使用空闲内存作为缓存(buff/cache)来提升性能,这部分内存在需要时可以立即释放。available才是判断内存是否紧张的关键指标。 -
误解负载平均值:认为负载必须低于1.0才是好的。负载的“正常”范围取决于你的 CPU 核心数和工作负载类型。在4核服务器上,4.0的负载是满载;而在一个经常处理大量I/O(如数据库)的服务器上,较高的负载可能是正常的。
-
在
top中迷失:进入top界面后不知道如何操作,只能强制关闭终端。记住最常用的键:q退出,P看CPU,M看内存,1看所有CPU核心。 -
混淆
used和available内存的关系:total = used + free + buff/cache。而available ≈ free + buff/cache(这部分缓存可以被快速回收)。
小结
- 内存监控看
free -h:重点关注available列,它比free列更能反映系统真实的可用内存状况。 - 快速健康检查用
uptime:一行命令就能告诉你系统跑了多久、有几个用户、以及过去的负载趋势。负载值需要结合你的CPU核心数来解读。 - 实时动态分析用
top:它是定位高资源消耗进程(CPU或内存大户)的利器。掌握几个基本的排序快捷键(P,M,1)就能高效使用。 - 这三个命令是系统管理员日常快速诊断的“听诊器”,熟练掌握它们是进行更深入系统监控和调优的基础。