2. Linux性能工具集:perf、strace、ltrace、top、htop、vmstat、iostat、netstat、sar等工具概览

说实话,刚入行那会儿,我面对一台卡成狗的服务器,第一反应就是敲个top看看。后来踩的坑多了,才发现每个工具都有自己的脾气和专长。这一章,我就带你把这些家伙挨个认识一遍。

核心观点:没有万能工具,只有合适的场景。你手里拿的是瑞士军刀,不是大锤。

2.1 工具全家桶:一张图看懂

先给你看张我画的图。这玩意儿我每次培训都会拿出来,说白了就是一张「性能排查地图」。

性能问题 排查入口 CPU & 进程 内存 & 交换 磁盘 I/O 网络 & 系统调用 top / htop perf vmstat iostat netstat strace / ltrace sar(全能监控)

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看热点。组合使用,才是高手。

好了,这一章的工具概览就到这里。每个工具都值得你花时间亲手敲一遍。别光看,打开终端试试——你会发现,性能排查其实没那么玄乎。

可可精品资料库