2. Linux性能工具集:perf、strace、ltrace、top、htop、vmstat、iostat、netstat、sar等工具概览
说实话,刚入行那会儿,我面对一台卡成狗的服务器,第一反应就是敲个top看看。后来踩的坑多了,才发现每个工具都有自己的脾气和专长。这一章,我就带你把这些家伙挨个认识一遍。
核心观点:没有万能工具,只有合适的场景。你手里拿的是瑞士军刀,不是大锤。
2.1 工具全家桶:一张图看懂
先给你看张我画的图。这玩意儿我每次培训都会拿出来,说白了就是一张「性能排查地图」。
2.2 CPU & 进程类工具
top / htop —— 入门必备
top是我用得最多的工具,没有之一。它就像汽车的仪表盘,一眼就能看到系统当前的健康状况。
我个人习惯,一上服务器先敲top,然后按P键按CPU排序,按M键按内存排序。这样最快找到「谁在吃资源」。
小技巧: htop是top的增强版,支持鼠标操作、彩色显示、树形进程视图。如果你能装,就别用top了。我在排查Java进程问题时,htop的树形视图帮我快速定位到了子线程的CPU飙升。
perf —— 性能分析的瑞士军刀
perf这玩意儿,说实话,入门有点门槛。但一旦用熟了,它就是你的「透视眼」。
它能干嘛?
- 统计CPU周期、缓存命中率、分支预测失败
- 采样分析热点函数(
perf top) - 记录并回放性能事件(
perf record+perf report)
# 实时查看CPU热点
perf top
# 采样30秒,然后分析
perf record -a -g -- sleep 30
perf report -g graph
注意: perf需要内核支持,某些容器环境或云主机可能受限。我曾经在阿里云的一台ECS上折腾了半天,最后发现内核没开PERF_EVENTS……白忙活。
2.3 内存 & 交换工具
vmstat —— 虚拟内存的「心电图」
vmstat是我排查内存问题的首选。它不像free那样只给个快照,而是能持续输出变化趋势。
# 每2秒输出一次,共输出5次
vmstat 2 5
输出里我最关注两列:
- si / so:交换入/出。如果这两个值持续非零,说明物理内存不够了。我遇到过一台数据库服务器,
so飙到几千,结果一看,swap分区在疯狂读写,磁盘I/O直接被打满。 - free:空闲内存。但注意,Linux会用空闲内存做缓存,所以
free小不一定代表内存不足。
避坑指南: 我曾经以为free命令显示的「available」才是真实可用内存。后来才发现,vmstat的free列是真正的未分配内存,而available是估算值。两者差距大时,说明缓存占了很多。
2.4 磁盘 I/O 工具
iostat —— 磁盘性能的「听诊器」
磁盘慢不慢,别靠感觉,用iostat说话。
# 查看磁盘I/O统计,每2秒刷新
iostat -x 2
关键指标:
| 指标 | 含义 | 正常范围 |
|---|---|---|
| %util | 磁盘忙绿百分比 | < 80% |
| await | I/O请求平均等待时间(ms) | < 10ms(SSD),< 30ms(HDD) |
| svctm | I/O服务时间(ms) | 越短越好 |
嗯,这里要注意:%util到100%不代表磁盘坏了,可能是队列太深。我见过一个案例,%util只有60%,但await已经200ms了——原因是磁盘在做大量的随机小IO,寻道时间占了大部分。
2.5 网络 & 系统调用工具
netstat —— 网络连接的「户口本」
虽然现在ss命令更高效,但netstat依然是我排查端口和连接状态的利器。
# 查看所有监听端口
netstat -tlnp
# 查看连接状态统计
netstat -ant | awk '{print $6}' | sort | uniq -c
你想想看,当你的服务报「端口被占用」时,netstat -tlnp | grep :8080是不是最快的方式?
strace / ltrace —— 追踪程序的「一举一动」
这两个工具,说白了就是「偷窥」程序在干什么。
- strace:追踪系统调用(如
open、read、write) - ltrace:追踪库函数调用(如
malloc、printf)
# 追踪某个PID的系统调用
strace -p 12345
# 只追踪与文件相关的系统调用
strace -e trace=file -p 12345
实战经验: 有一次Nginx响应特别慢,我用strace -c -p $(pidof nginx)统计了系统调用耗时,发现epoll_wait占了99%的时间——说明Nginx在等事件,不是它在忙。问题出在后端服务上。
2.6 全能选手:sar
sar是我最敬重的工具。它能收集CPU、内存、磁盘、网络、进程等所有历史数据。说白了,它就是系统的「黑匣子」。
# 查看今天的CPU历史数据
sar -u
# 查看内存历史数据
sar -r
# 查看网络流量历史
sar -n DEV
我个人习惯,所有服务器都开启sysstat服务,这样出问题时可以回头看历史数据。有一次凌晨3点服务挂了,我早上过来用sar -u -f /var/log/sa/sa06一看,凌晨2:45 CPU突然飙到100%——原来是定时任务和业务高峰撞车了。
一句话总结: top看当下,sar看历史,strace看细节,perf看热点。组合使用,才是高手。
好了,这一章的工具概览就到这里。每个工具都值得你花时间亲手敲一遍。别光看,打开终端试试——你会发现,性能排查其实没那么玄乎。