3. 系统资源监控实战

系统资源监控不是把五个指标分别看一眼,而是建立一条从“整机表现”到“具体进程”的定位链路。整机层面看 CPU、内存、磁盘、网络四类资源是否饱和;进程层面看谁在消耗这些资源;再结合时间维度判断是瞬时抖动还是持续劣化。本节围绕这条链路,给出可直接在 RHEL 上执行的采集命令、判读依据和定位方法。

CPU使用率与负载:先分清“忙”和“等”

CPU 使用率描述 CPU 时间被消耗的比例,负载(load average)描述的是处于可运行状态和不可中断睡眠状态的任务数量。两者含义不同:CPU 使用率高说明 CPU 确实在干活;负载高但 CPU 使用率不高,往往意味着大量任务卡在磁盘 I/O 或内核等待上。RHEL 中常用 top、vmstat、mpstat 观察。

# 每秒采样一次,共 5 次,观察各 CPU 核的分布
mpstat -P ALL 1 5

# 观察运行队列 r、阻塞进程 b、上下文切换 cs、中断 in
vmstat 1 5

# 查看 1/5/15 分钟负载与运行任务数
uptime
cat /proc/loadavg

判读要点:vmstat 输出中 r 列持续大于 CPU 逻辑核数,说明存在排队;b 列长期非零,说明有进程处于不可中断睡眠,通常指向磁盘或网络存储;us 高说明用户态计算密集,sy 高说明系统调用或中断开销大,wa 高说明 CPU 在等 I/O,st 非零说明虚拟机被宿主机抢占。负载的合理阈值不是固定值,一般以“负载 ≈ 逻辑核数”为参考线,超过 1.5 倍需关注,超过 2 倍通常已影响响应。

内存与Swap:区分“用满”和“不够用”

Linux 会把空闲内存用于缓存,因此 free 显示的内存“已用”并不等于真正紧张。关键看 available 列,它表示在不触发 Swap 的前提下还能分配给新进程的内存。Swap 使用量本身不是故障,但持续增长的 Swap 换入换出(si/so)才是内存压力的信号。

free -h
vmstat 1 5          # 关注 si、so 两列
cat /proc/meminfo | egrep 'MemTotal|MemAvailable|SwapTotal|SwapFree|Dirty'
# 找出占用内存最高的 10 个进程
ps -eo pid,comm,rss,vsz --sort=-rss | head -n 11

判读要点:available 低于总内存 10% 且 si/so 持续大于 0,说明内存已不足,系统开始用磁盘换内存,性能会明显下降;Dirty 值长期偏高说明脏页回写跟不上写入速度,可能引发突发 I/O 抖动。若确认是某个进程内存泄漏,可结合 ps 的 RSS 增长趋势判断,而不是只看某一时刻的绝对值。

磁盘I/O与吞吐量:看延迟,不只看带宽

磁盘监控最容易犯的错误是只看吞吐量(MB/s)。真正影响业务响应的是 I/O 延迟和队列深度。RHEL 中推荐使用 iostat -x 观察每个设备的扩展指标。

iostat -x 1 5
# 关键列:r/s w/s rkB/s wkB/s await r_await w_await aqu-sz %util

判读要点:%util 接近 100% 说明设备几乎一直在处理请求;await 是平均每次 I/O 的等待时间(含排队),机械盘通常应低于 20ms,SSD 应低于 1~2ms;aqu-sz 是平均队列长度,持续大于 2 说明请求在排队。若 %util 高但吞吐量低,通常是随机小 I/O 为主;若吞吐量高而 await 低,说明顺序大 I/O 且设备能力充足。定位到具体进程可用 iotop -oP 或 pidstat -d 1。

网络流量与连接状态:从带宽到连接数

网络监控分两层:一是流量速率,二是连接状态。带宽跑满会丢包重传,连接数异常则可能是攻击或连接泄漏。

# 查看网卡累计与实时速率
sar -n DEV 1 5
# 查看 TCP 连接状态分布
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# 查看监听端口与对应进程
ss -lntp

判读要点:sar -n DEV 的 rxkB/s、txkB/s 接近网卡带宽上限时,需检查是否有重传;ss -s 中 timewait 数量过大通常是短连接频繁创建销毁,可考虑连接复用;SYN-RECV 大量堆积往往指向 SYN Flood 或后端握手异常;ESTAB 数量远超业务预期,需排查连接池配置或连接泄漏。

进程级资源追踪:把整机问题落到具体进程

整机指标只能说明“有问题”,进程级追踪才能回答“是谁的问题”。常用工具是 pidstat 和 top -H。

# 每秒输出一次,共 5 次,显示 CPU、内存、磁盘、上下文切换
pidstat -u -r -d -w 1 5
# 查看某进程内各线程的 CPU 占用
top -H -p 12345
# 查看进程打开的文件与网络连接
lsof -p 12345 | head

判读要点:pidstat -u 的 %CPU 是进程级汇总,若某进程 CPU 高但线程分散,说明是多线程并行计算;若单线程接近 100%,说明存在单线程瓶颈。pidstat -w 的 cswch/s 高说明进程频繁主动让出 CPU,常见于锁竞争或 I/O 等待;nvcswch/s 高说明被强制调度,通常是 CPU 争抢激烈。结合 pidstat -d 的 kB_rd/s、kB_wr/s 可确认磁盘压力来源。

系统资源监控定位链路:整机 → 资源 → 进程 整机层 uptime / /proc/loadavg:1、5、15 分钟负载与运行任务数 vmstat 1 5:r 运行队列、b 阻塞、si/so 换页、cs 上下文切换、wa 等 I/O CPU mpstat -P ALL 1 5 us/sy/wa/st 分布 r > 逻辑核数 → 排队 wa 高 → 等磁盘 st 非零 → 被虚拟化抢占 内存 / Swap free -h 看 available vmstat 看 si / so available < 10% 且换页 Dirty 高 → 回写压力 ps --sort=-rss 找大户 磁盘 I/O iostat -x 1 5 %util 接近 100% → 忙 await 高 → 延迟大 aqu-sz > 2 → 排队 iotop -oP 定位进程 网络 sar -n DEV 1 5 rxkB/s、txkB/s 速率 ss -s 连接状态汇总 SYN-RECV 堆积 → 攻击 TIME-WAIT 多 → 短连接 进程层:把整机异常落到具体进程 pidstat -u -r -d -w 1 5:%CPU、RSS、kB_rd/s、kB_wr/s、cswch/s、nvcswch/s top -H -p PID:查看线程级 CPU,判断单线程瓶颈还是多线程并行 lsof -p PID:确认进程打开的文件与网络连接,辅助判断资源占用来源 判读顺序:先看整机是否饱和 → 再看哪类资源是瓶颈 → 最后用进程级工具锁定消耗者,并结合时间趋势区分瞬时抖动与持续劣化。

综合定位示例

假设某台 8 核 RHEL 服务器业务响应变慢。执行 uptime 看到负载为 12.5,vmstat 1 5 显示 r 约 10、wa 约 35、si/so 为 0,iostat -x 1 5 显示 sda 的 %util 为 98%、await 为 45ms、aqu-sz 为 3.2。此时可判断:CPU 负载高主要来自 I/O 等待,瓶颈在磁盘。再用 pidstat -d 1 5 找到某进程 kB_wr/s 持续在 80MB/s 以上,结合 lsof -p 确认它在写日志文件,即可定位为日志写入导致的磁盘饱和。处理方向是调整日志级别、增加异步落盘或迁移日志盘,而不是盲目扩容 CPU。

监控指标要结合时间窗口看趋势。单次采样容易受瞬时峰值干扰,建议至少连续观察 5 个采样周期,并对比业务高峰与低谷时段的基线值。
不要仅凭 free 的 used 列判断内存不足,也不要仅凭 %util 判断磁盘故障。必须结合 available、si/so、await、aqu-sz 等指标交叉验证,避免误判。