3. 性能监控工具链

性能监控是性能优化的前提。Linux 系统提供了一套从系统整体到设备细节的监控工具链,掌握这些工具的输出解读,是定位性能瓶颈的核心能力。本章将系统讲解 top/htop、vmstat、iostat、mpstat、sar、dstat 等工具的使用方法与关键指标含义。

学习目标:能够熟练使用上述工具采集 CPU、内存、磁盘 I/O、网络、上下文切换等关键性能数据,并快速识别异常指标。

3.1 工具全景与定位

不同的监控工具关注不同的系统资源维度。下表梳理了各工具的核心定位与典型场景:

工具 主要监控维度 典型场景 输出特点
top / htop 进程级 CPU、内存、负载 实时查看最耗资源的进程 动态刷新,交互式
vmstat 系统整体:进程、内存、分页、CPU 快速判断系统是否过载 简洁列式,适合脚本
iostat 磁盘 I/O 吞吐、利用率、响应时间 定位磁盘瓶颈 设备级与 CPU 统计
mpstat 每个 CPU 核心的使用率细分 分析 CPU 负载是否均衡 多核分解输出
sar 历史数据采集:CPU、内存、I/O、网络 回溯分析历史性能问题 周期性记录,可回放
dstat 多维度实时汇总 一键查看系统综合状态 可定制,支持插件
实战建议:日常排查遵循“先整体后局部”原则:先用 vmstat 1 看系统整体水位,再用 mpstat -P ALL 1 看 CPU 分布,最后用 top 定位具体进程。

3.2 top / htop:进程级实时监控

top 是 Linux 最经典的进程监控工具,htop 是其增强版,提供彩色界面、鼠标操作和树形视图。

3.2.1 top 核心字段解读

执行 top 后,输出分为上下两部分:统计信息区和进程列表区。

top - 14:23:45 up 10 days,  2:15,  3 users,  load average: 2.01, 1.85, 1.72
Tasks: 245 total,   1 running, 244 sleeping,   0 stopped,   0 zombie
%Cpu(s): 15.3 us,  3.2 sy,  0.0 ni, 80.5 id,  0.5 wa,  0.0 hi,  0.5 si,  0.0 st
MiB Mem :  15984.3 total,   2345.6 free,   6789.1 used,   6849.6 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   7890.2 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 root      20   0 1624.4g 2.3g  12.4m S  45.6  14.7  12:34.56 java
 5678 mysql     20   0  12.5g 1.1g   8.2m S  12.3   7.2   5:12.34 mysqld
字段 含义 关注点
load average 1/5/15 分钟平均运行队列长度 超过 CPU 核心数说明过载
us / sy / id / wa 用户态 / 内核态 / 空闲 / 等待 I/O 的 CPU 占比 wa 高 → 磁盘瓶颈;sy 高 → 系统调用频繁
RES 常驻物理内存 (Resident Memory) 进程实际占用的物理内存
%CPU 进程 CPU 使用率(多核累加) 单进程超过 100% 说明多线程
S 进程状态:R(运行) S(睡眠) D(不可中断) Z(僵尸) 大量 D 状态 → I/O 阻塞;Z 状态 → 父进程未回收
常见误区:top 中的 %CPU 是相对于单核的百分比。4 核 CPU 上一个进程占满 4 个核会显示 400%,而非 100%。使用 htop 可以更直观地看到每个 CPU 核心的负载条。

3.2.2 htop 增强特性

  • 彩色显示:CPU、内存、交换分区使用不同颜色条实时展示使用率。
  • 树形视图:按 F5 切换,显示进程父子关系,便于定位 fork 炸弹或僵尸进程。
  • 鼠标操作:可直接点击进程、排序、发送信号。
  • 自定义列:可添加 IO 读写速率、线程数、页错误等字段。
# 安装 htop(CentOS / Ubuntu)
sudo yum install htop -y      # CentOS/RHEL
sudo apt install htop -y      # Ubuntu/Debian

# 常用交互快捷键
F2: 设置界面       F3: 搜索进程       F4: 过滤进程
F5: 树形视图       F6: 排序选择       F9: 发送信号
top/htop 进程状态与 CPU 时间分解 进程状态 (S 字段) R (Running) S (Sleeping) D (Uninterruptible) Z (Zombie) D 状态 → 等待 I/O 完成,不可被信号打断 Z 状态 → 进程已结束,但父进程未调用 wait() 大量 D 状态进程 → 磁盘或存储子系统瓶颈 CPU 时间分解 (%Cpu(s)) us 用户态进程执行时间 sy 内核态系统调用时间 id 空闲时间 wa 等待 I/O 完成的时间 hi 硬件中断处理时间 si 软件中断处理时间

3.3 vmstat:系统整体状态快照

vmstat 是性能排查的“第一站”,它以简洁的列式输出展示进程、内存、分页、块 I/O、中断和 CPU 活动。

3.3.1 常用命令格式

# 每隔 1 秒输出一次,共输出 5 次
vmstat 1 5

# 输出示例
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 2345600 123400 6725000    0    0    12    45  345  678 15  3 80  2  0
 3  1      0 2338900 123450 6726000    0    0   256   120  567  890 20  5 70  5  0

3.3.2 关键指标解读

类别 字段 含义 警戒线
procs r 运行队列中的进程数(等待 CPU) 持续 > CPU 核心数 × 2
b 不可中断睡眠进程数(等待 I/O) 持续 > 0 说明 I/O 瓶颈
memory swpd 已使用的交换空间大小 持续增长说明内存不足
free 空闲物理内存 接近 0 不一定危险,需结合 cache
swap si / so 每秒从磁盘换入/换出的内存量 持续 > 0 说明内存严重不足
io bi / bo 每秒块设备接收/发送的块数 异常突增说明 I/O 压力大
system in 每秒中断次数 突增可能由硬件或网络引起
cs 每秒上下文切换次数 持续 > 100000 需关注
cpu us / sy / id / wa / st 同 top 的 CPU 时间分解 wa > 30% 需排查磁盘
实战口诀:“r 高 CPU 忙,b 高 I/O 堵;si/so 非零内存慌,cs 过高锁争抢。”

3.4 iostat:磁盘 I/O 深度分析

iostat 属于 sysstat 包,专门用于监控磁盘 I/O 子系统的性能。它提供设备级别的吞吐量、IOPS、响应时间和队列长度。

3.4.1 命令与输出

# 每隔 2 秒输出一次,监控 sda 设备
iostat -x sda 2

# 输出示例
Device            r/s     w/s    rkB/s    wkB/s  avgrq-sz avgqu-sz  await  svctm  %util
sda             45.0   120.0   360.0   960.0     16.0     2.50   15.2   4.50  74.3

3.4.2 核心指标详解

指标 含义 计算公式 关注点
r/s, w/s 每秒读/写请求次数(IOPS) 直接统计 接近设备极限 IOPS 时需升级硬件
rkB/s, wkB/s 每秒读/写吞吐量 r/s × 平均请求大小 接近设备带宽上限
avgrq-sz 平均 I/O 请求大小(扇区数) 总吞吐 / 总 IOPS 过小说明大量小文件随机读写
avgqu-sz 平均 I/O 队列长度 等待队列 + 正在服务的请求数 持续 > 1 说明设备过载
await 平均 I/O 响应时间(毫秒) 总等待时间 / 总请求数 SSD < 2ms,HDD < 10ms 为正常
svctm 平均服务时间(毫秒) 设备处理一个请求的时间 接近 await 说明队列不深
%util 设备忙绿百分比 (svctm × IOPS) / 1000 接近 100% 说明磁盘饱和
注意:%util 对于 SSD 和 NVMe 设备可能不准确,因为这些设备支持并行处理多个请求。此时应更多关注 await 和 avgqu-sz。
iostat 磁盘 I/O 性能指标关系 I/O 请求 (r/s, w/s) I/O 队列 (avgqu-sz) 磁盘设备 (svctm) 吞吐量 (rkB/s, wkB/s) 响应时间 (await) 设备利用率 (%util) await = 队列等待时间 + svctm %util 接近 100% 时,avgqu-sz 会急剧上升,await 显著增大

3.5 mpstat:多核 CPU 分解

mpstat 可以查看每个 CPU 核心的使用情况,是分析 CPU 负载是否均衡、是否存在单核瓶颈的利器。

# 查看所有 CPU 核心,每隔 1 秒输出
mpstat -P ALL 1

# 输出示例
Linux 5.10.0 (hostname)   2025-01-15  _x86_64_  (4 CPU)

14:30:01     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14:30:02     all   15.23    0.00    3.12    0.50    0.00    0.50    0.00    0.00    0.00   80.65
14:30:02       0   30.50    0.00    5.10    1.00    0.00    1.00    0.00    0.00    0.00   62.40
14:30:02       1    5.20    0.00    1.50    0.20    0.00    0.30    0.00    0.00    0.00   92.80
14:30:02       2   10.10    0.00    2.80    0.40    0.00    0.40    0.00    0.00    0.00   86.30
14:30:02       3   15.10    0.00    3.10    0.40    0.00    0.30    0.00    0.00    0.00   81.10
分析要点:
  • 如果某个核心的 %usr 远高于其他核心,说明存在单线程热点,应用需要优化并发设计。
  • 如果所有核心的 %iowait 都高,说明磁盘是全局瓶颈。
  • 如果 %sys 普遍偏高(> 20%),说明系统调用或内核态操作频繁,如大量上下文切换、中断处理。

3.6 sar:历史数据回溯分析

sar 是 sysstat 包的核心工具,可以采集并保存系统历史性能数据,用于事后分析和趋势对比。

3.6.1 数据采集配置

# sysstat 服务默认每 10 分钟采集一次数据,保存 7 天
# 配置文件位置:/etc/sysconfig/sysstat 或 /etc/default/sysstat

# 手动启动采集服务
systemctl start sysstat
systemctl enable sysstat

3.6.2 常用查询命令

命令 功能
sar -u 查看历史 CPU 使用率
sar -r 查看历史内存使用情况
sar -b 查看历史磁盘 I/O 统计
sar -n DEV 查看历史网络接口流量
sar -q 查看历史系统负载和队列
sar -S 查看历史交换空间使用
sar -f /var/log/sa/sa15 查看指定日期的历史数据(sa15 表示当月 15 日)
# 查看今天上午 10:00 到 12:00 的 CPU 使用率
sar -u -s 10:00:00 -e 12:00:00

# 输出示例
10:10:01     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:20:01     all     12.50      0.00      3.20      0.80      0.00     83.50
10:30:01     all     45.30      0.00      8.10      2.50      0.00     44.10  ← 异常高峰
10:40:01     all     11.80      0.00      2.90      0.60      0.00     84.70
实战场景:当用户反馈“昨天下午系统很慢”时,使用 sar -q -f /var/log/sa/sa$(date +%d -d 'yesterday') 查看昨天的负载队列长度,快速定位异常时间段。

3.7 dstat:一站式实时监控

dstat 可以看作是 vmstat + iostat + mpstat + netstat 的整合版,支持插件扩展,输出格式灵活。

3.7.1 基本用法

# 安装 dstat
sudo yum install dstat -y      # CentOS/RHEL
sudo apt install dstat -y      # Ubuntu/Debian

# 默认输出:CPU、磁盘、网络、分页、系统
dstat 1

# 自定义输出:只显示 CPU、内存、磁盘 I/O
dstat -c -m -d 1

# 输出到 CSV 文件,便于后续分析
dstat --output /tmp/perf.csv 1 60

3.7.2 常用插件与选项

选项 监控内容 示例
-c CPU 使用率(usr/sys/idl/wai/hiq/siq) dstat -c
-d 磁盘读写速率 dstat -d
-n 网络收发流量 dstat -n
-m 内存使用情况 dstat -m
-p 进程统计(运行/阻塞/新建) dstat -p
--top-cpu 显示最耗 CPU 的进程 dstat --top-cpu
--top-io 显示最耗 I/O 的进程 dstat --top-io
--top-mem 显示最耗内存的进程 dstat --top-mem
# 综合监控:CPU、磁盘、网络、最耗资源的进程
dstat -c -d -n --top-cpu --top-io --top-mem 2
# 输出示例(每 2 秒刷新)
----cpu-usage---- --dsk/total- -net/total- ---most-expensive-cpu-process--- ----most-expensive-io-process--- ---most-expensive-memory-process---
usr sys idl wai hiq siq| read  writ| recv  send|process            pid  cpu|