2. Linux性能工具集:perf、top、htop、vmstat、iostat、netstat 的基本使用
说实话,刚入行那会儿,我面对着一堆Linux命令也是懵的。top、vmstat、iostat……每个工具看起来都能看点什么,但到底什么时候用哪个?
后来踩的坑多了,慢慢就摸出了门道。今天我就把这几个最常用的工具,给你捋一遍。说白了,它们就像医生的听诊器、血压计、心电图——各有各的用处,组合起来才能准确诊断。
核心思路:性能分析不是靠一个工具包打天下。你得知道每个工具擅长什么,然后对症下药。
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,那就像用手术刀削苹果——杀鸡用牛刀了。