第4章 性能监控工具:top、htop、vmstat、iostat、netstat、dstat

4.1 站在监控的起点

调优就像修车,你得先知道哪里在响。性能监控工具就是你的“听诊器”。

我刚开始做运维时,遇到系统卡顿只会重启。后来一位老工程师告诉我:“你连瓶颈在哪都不知道,重启一百次也没用。” 从那天起,我开始一个一个吃透这些命令行工具。它们看起来很基础,但99%的线上问题都靠它们定位。

核心原则:不要一次性把所有工具全打开。先回顾整体(vmstat / dstat),再聚焦具体环节(top / iostat / netstat)。

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 过滤进程名。
避坑:我曾经在top里只看 %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 / soswap 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 —— 读写吞吐量。
避坑:我曾经被%util=100%迷惑过。 当时一块NVMe SSD,%util达到100%但吞吐量并不高,await也只有2ms。后来发现是单线程随机读写太多,队列深度不够。简单的方案是调大应用并发数,%util反而降下来了。所以%util高 ≠ 磁盘已到物理极限,要结合 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 显示响应延迟最高的进程。

经验:第一次用dstat时别开太多列,默认已经够用了。我见过有人把20个列堆一起,屏幕完全花掉。先看CPU、磁盘IO、网络三列就够。

4.7 工具对比与选择

这些工具有各自的侧重,我把它整理成了一个表格,方便你在不同场景下快速选出合适的工具:

监控维度推荐工具关键指标常用命令示例
CPU使用top / htop%CPU, load averagetop -bn1
CPU队列vmstatr, bvmstat 1 3
内存free / vmstatsi/so, availablefree -m
磁盘I/Oiostat%util, await, r/s, w/siostat -x 2
网络连接ss / netstat连接数, 状态分布ss -s
综合监控dstat全部dstat -cdn 2 5

最后想说:工具只是手段,关键是要理解每个指标背后的含义。你想想看,如果不懂 %wa 是什么,就算把iostat输出贴到你脸上也没用。所以每次遇到问题,我的习惯是先问自己三句话:

  1. CPU在忙什么?
  2. 内存够不够?
  3. I/O在等什么?

然后把上面的工具按需组合,90%的问题都能在一两分钟内定位。好了,接下来就看你的实践了。

性能监控工具全景图 Linux 内核/系统 CPU 内存 磁盘 I/O 网络 整体系统 top / htop vmstat iostat ss / netstat / dstat