第4章 性能监控工具:top、htop、vmstat、iostat、netstat、dstat
4.1 站在监控的起点
调优就像修车,你得先知道哪里在响。性能监控工具就是你的“听诊器”。
我刚开始做运维时,遇到系统卡顿只会重启。后来一位老工程师告诉我:“你连瓶颈在哪都不知道,重启一百次也没用。” 从那天起,我开始一个一个吃透这些命令行工具。它们看起来很基础,但99%的线上问题都靠它们定位。
4.2 top / htop:进程级监控
top 是Linux里最常用的性能仪表盘。我个人习惯先看 load average,如果三个数值都超过CPU核数,说明系统已经高负载了。
关键列我一般盯这几个:
- %CPU —— 哪个进程在吃CPU?
- %MEM —— 内存占用大户是谁?
- RES —— 常驻内存大小,别被
VIRT吓到。
htop 是top的增强版。我记得第一次用htop时,最惊喜的是可以用鼠标点选进程、按F6排序。另外它还能直接显示每个CPU核心的使用率,排查多核负载不均特别好用。
常用操作:
- top 里按
1查看每个CPU核心。 - top 里按
M按内存排序,P按CPU排序。 - htop 里按
F4过滤进程名。
%CPU 就下结论说进程正常,结果后来发现 wait 值很高,其实是I/O阻塞导致进程实际上没在干活。所以要配合 %wa 一起看。
4.3 vmstat:系统整体运行状态
vmstat 是我排查CPU和内存问题时第一个敲的命令。一句话总结:它告诉你系统在“忙”还是“等”。
我常用的格式:
vmstat 2 5 # 每2秒采样一次,输出5次
输出字段里,我最关注这几个:
| 字段 | 含义 | 重点关注信号 |
|---|---|---|
| r | 运行队列中的进程数 | 持续大于CPU核数 → CPU瓶颈 |
| b | 不可中断睡眠进程数 | 持续大于0 → I/O瓶颈 |
| us | 用户态CPU时间(%) | 高 → 用户进程在忙 |
| sy | 系统态CPU时间(%) | 超过30% → 系统调用过频 |
| wa | 等待I/O的CPU时间(%) | 高 → 磁盘成为瓶颈 |
| si / so | swap in/out | 非零 → 内存不足,开始换页 |
为什么会看 si/so?我记得有一次线上数据库查询突然变慢,top里CPU不高,但vmstat的swap列一直在跳动。一查,内存被一个日志进程吃光了,数据库开始大量换页。把日志进程的日志轮转周期调短后,问题马上消失。
4.4 iostat:磁盘I/O瓶颈分析
如果你怀疑磁盘是瓶颈,iostat 是必须用到的工具。我通常会加上 -x 参数获取扩展统计:
iostat -x 2 5
重点关注:
- %util —— 磁盘忙的百分比。接近100%通常表示磁盘满负荷。
- await —— I/O平均响应时间(毫秒)。SSD一般 < 1 ms,机械盘 < 10ms。
- svctm —— I/O平均服务时间(已被await覆盖,但可以辅助看是否纯机械延迟)。
- rkB/s / wkB/s —— 读写吞吐量。
r/s 和 w/s 判断。
另外,iostat -p sda 可以看单个分区,排查某块磁盘内部不同分区的负载差异。
4.5 netstat 与 ss:网络连接诊断
netstat 是老牌网络监控工具,但我现在更多用 ss,更快,输出更清晰。为什么呢?netstat的底层是读 /proc/net,而ss直接使用内核的socket接口,数据量大的时候不会卡死。
常用场景:
- 查看当前所有连接:
ss -tunap - 统计各状态连接数:
ss -s - 监听端口服务:
ss -lntp
我曾经通过 ss -s 发现线上服务有大量 CLOSE_WAIT 状态的连接。正常情况 CLOSE_WAIT 应该很快消失,但持续堆积说明服务端没有正确关闭socket。顺藤摸瓜找到了一个连接池泄漏的bug。
如果你非要用 netstat,加个 -c 参数可以连续输出,省得每次手动刷新。
4.6 dstat:全能型组合监控
说实话,以前我总是同时开着多个终端跑top、vmstat、iostat。后来发现 dstat 可以直接吧这些信息合并在一个视图中。它的设计理念是“all-in-one”。
我常用的命令:
dstat -c -d -n -m --top-cpu --top-io 2 10
这行命令会同时显示CPU、磁盘、网络、内存信息,并且列出CPU最忙的进程和I/O最忙的进程。当你需要快速定位问题时,简直不要太爽。
dstat 还支持插件:--top-bio 显示块I/O最多的进程,--top-latency 显示响应延迟最高的进程。
4.7 工具对比与选择
这些工具有各自的侧重,我把它整理成了一个表格,方便你在不同场景下快速选出合适的工具:
| 监控维度 | 推荐工具 | 关键指标 | 常用命令示例 |
|---|---|---|---|
| CPU使用 | top / htop | %CPU, load average | top -bn1 |
| CPU队列 | vmstat | r, b | vmstat 1 3 |
| 内存 | free / vmstat | si/so, available | free -m |
| 磁盘I/O | iostat | %util, await, r/s, w/s | iostat -x 2 |
| 网络连接 | ss / netstat | 连接数, 状态分布 | ss -s |
| 综合监控 | dstat | 全部 | dstat -cdn 2 5 |
最后想说:工具只是手段,关键是要理解每个指标背后的含义。你想想看,如果不懂 %wa 是什么,就算把iostat输出贴到你脸上也没用。所以每次遇到问题,我的习惯是先问自己三句话:
- CPU在忙什么?
- 内存够不够?
- I/O在等什么?
然后把上面的工具按需组合,90%的问题都能在一两分钟内定位。好了,接下来就看你的实践了。