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: 发送信号
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。
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|