2. Linux性能工具集:perf、top、htop、vmstat、iostat、netstat 的基本使用

说实话,刚入行那会儿,我面对着一堆Linux命令也是懵的。top、vmstat、iostat……每个工具看起来都能看点什么,但到底什么时候用哪个?

后来踩的坑多了,慢慢就摸出了门道。今天我就把这几个最常用的工具,给你捋一遍。说白了,它们就像医生的听诊器、血压计、心电图——各有各的用处,组合起来才能准确诊断。

核心思路:性能分析不是靠一个工具包打天下。你得知道每个工具擅长什么,然后对症下药。

Linux 性能工具集 · 知识体系 性能分析 工具矩阵 CPU top / htop / perf 负载 · 上下文切换 内存 vmstat / top swap · 缓存 · 泄漏 磁盘IO iostat / iotop 吞吐 · 延迟 · 队列 网络 netstat / ss 连接 · 端口 · 丢包 每个工具只擅长一个维度,组合使用才能定位真凶

2.1 top —— 系统概况的第一眼

top 是我每次登录服务器后,第一个敲的命令。为什么?因为它能让你在3秒内判断系统「有没有病」。

# 最常用的启动方式
top

# 按 CPU 使用率排序(进入 top 后按 P)
# 按内存使用率排序(进入 top 后按 M)
# 查看每个 CPU 核心负载(进入 top 后按 1)

你看,就这么简单。但很多人只盯着 %CPU 那一列,其实有几个关键点容易被忽略:

  • load average —— 三个数值分别代表1、5、15分钟的平均负载。如果1分钟远大于15分钟,说明系统正在经历突发压力。
  • us + sy 占比 —— us 是用户态,sy 是内核态。如果 sy 超过 30%,说明系统调用太频繁了,代码可能有问题。
  • wa 指标 —— iowait,如果这个值高,别盯着 CPU 了,问题在磁盘。

我的小技巧:我习惯用 top -b -n 1 把结果一次性输出,然后配合 grep 抓取特定进程。比如排查 Java 应用时,直接 top -b -n 1 | grep java,干净利落。

2.2 htop —— top 的视觉升级版

htop 其实就是 top 的「高清重制版」。我个人非常喜欢它,因为它能让你用鼠标操作——对,你没看错,Linux 命令行里能用鼠标。

# 安装(CentOS)
yum install htop -y

# 安装(Ubuntu)
apt install htop -y

# 启动
htop

htop 比 top 多了几个实用功能:

  • 彩色显示,CPU、内存、swap 一眼就能区分
  • 可以直接用 F6 选择排序字段
  • 支持树形视图(F5),能看到进程的父子关系
  • 可以垂直/水平滚动,查看完整命令行

注意:htop 默认不显示进程的完整路径。如果你需要排查哪个脚本在吃资源,记得按 F2 进入设置,把 COMMAND 列调出来。

2.3 vmstat —— 系统瓶颈的「体检报告」

vmstat 是我排查性能问题时,用的最多的工具之一。它不像 top 那样花哨,但信息密度极高。

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

输出结果长这样(我简化了):

类别 字段 含义 警戒线
CPU us/sy/id/wa 用户态/内核态/空闲/iowait sy > 30% 或 wa > 20%
内存 swpd/free/buff/cache 已用swap/空闲/缓冲区/缓存 swpd > 0 且持续增长
swap si/so 换入/换出 si 或 so > 0
系统 in/cs 中断数/上下文切换 cs 突增数倍

嗯,这里要注意:很多人看到 swpd 不为 0 就慌了。其实不一定——Linux 会主动把空闲内存换出去。真正有问题的是 si 和 so 持续不为 0,那才说明物理内存真的不够了。

实战经验:有一次线上服务响应变慢,我看了 top 发现 CPU 空闲 80%,但 vmstat 的 wa 高达 40%。立刻意识到是磁盘 IO 瓶颈。后来一查,是日志写得太猛了。调整日志级别后,问题解决。

2.4 iostat —— 磁盘性能的「显微镜」

iostat 专门看磁盘。我建议你重点关注两个指标:await 和 %util。

# 查看磁盘详细情况,单位兆字节
iostat -x -m 1 3

关键字段解读:

  • r/s, w/s —— 每秒读/写请求数。不是越大越好,要看磁盘的 IOPS 上限。
  • rkB/s, wkB/s —— 每秒读/写的数据量。SSD 一般能到几百 MB/s。
  • await —— IO 请求的平均等待时间(毫秒)。SSD 应该在 1ms 以内,机械盘在 10ms 以内算正常。
  • %util —— 磁盘忙碌百分比。接近 100% 说明磁盘已经满负荷了。

我曾经踩过的坑:%util 到 100% 不一定代表磁盘坏了。如果磁盘是 SSD,它可能只是瞬间爆发。要结合 await 看——如果 await 也飙升,那才是真有问题。

2.5 netstat —— 网络连接的「户籍警」

netstat 虽然老,但依然好用。我主要用它来查三个东西:端口监听、连接数、以及连接状态。

# 查看所有监听端口
netstat -tlnp

# 查看所有 TCP 连接,显示进程名
netstat -antp

# 统计各种连接状态的数量
netstat -ant | awk '{print $6}' | sort | uniq -c

你想想看,当你的服务突然变慢,第一件事就是看连接数。如果 TIME_WAIT 状态有几千个,那八成是短连接没复用,需要优化代码或者调整内核参数。

替代方案:现在很多系统推荐用 ss 替代 netstat,因为 ss 更快。但我个人还是习惯 netstat,毕竟用了十几年了。不过新环境我建议你直接用 ss,命令参数几乎一样。

2.6 perf —— 性能分析的「终极武器」

perf 是 Linux 内核自带的性能剖析工具。说实话,它有点复杂,但一旦用好了,威力巨大。

# 统计 CPU 周期事件
perf stat -e cycles,instructions,cache-misses ./myapp

# 实时采样,生成报告
perf record -a -g -- sleep 10
perf report

perf 能告诉你:

  • CPU 到底在忙什么(热点函数)
  • 缓存命中率如何
  • 分支预测失败了多少次
  • 哪些代码路径消耗了最多的 CPU 时间

我的使用场景:有一次一个 C++ 服务 CPU 跑满,top 只能看到进程名,不知道具体哪段代码有问题。用 perf record 采样 10 秒,然后 perf report 一看,发现是一个字符串处理函数占用了 60% 的 CPU。优化后性能提升了 3 倍。

小结一下

这六个工具,各有各的定位:

  • top/htop —— 第一眼诊断,看谁在吃资源
  • vmstat —— 系统整体健康检查,定位瓶颈方向
  • iostat —— 磁盘 IO 深度分析
  • netstat —— 网络连接排查
  • perf —— 代码级性能剖析,终极手段

记住一个原则:从宏观到微观,从简单到复杂。先用 top 看个大概,再用 vmstat 定位方向,最后用 perf 深挖细节。别一上来就 perf record,那就像用手术刀削苹果——杀鸡用牛刀了。

可可精品资料库