记得那是个深夜,我盯着服务器监控面板,CPU飙升到95%,响应时间突破10秒。团队里几个“老鸟”轮番上阵,各种重启、扩容,折腾了俩小时毫无进展。最后我冷静地敲了几个top、vmstat命令,5分钟就锁定了问题——一个疯狂fork的子进程,直接kill搞定。那次之后,我深刻意识到:真正的Linux高手,靠的不是直觉,而是精准的命令诊断。今天,我就把这5个压箱底的性能优化命令拆给你看。
📊 1. top 命令:不止是看一眼CPU
大多数人对top命令的理解就是“看CPU使用率”。但到了2026年,真正的价值在于它的交互式诊断能力。按下1键,立马显示每个CPU核的独立负载;按m键,按内存使用排序——瞬间找出是哪个进程在“吃内存”。
更高级的用法:使用top -H -p [PID]可以查看某个进程的所有线程,这对排查死循环或锁竞争问题极其实用。比如你发现Java进程CPU占用高,直接查线程ID,再结合jstack定位到具体代码行。
# 查看进程内每个线程的CPU占用top -H -p 12345# 进入top后按c键,显示完整的命令行参数# 按shift+w保存当前配置到 ~/.toprc
⚡ 小技巧:top -bn1 可以以非交互模式运行一次,方便脚本化采集数据。
⏱️ 2. vmstat 与 iostat:系统瓶颈的“透视镜”
vmstat 1 命令每秒输出一次系统状态,重点关注r(运行队列)和b(阻塞队列)两列。当r持续大于CPU核数,说明CPU过载;b持续大于0,大概率是磁盘I/O瓶颈。
而iostat -x 1则能给出更细粒度的磁盘分析。看着%util和await值,你就能判断:是磁盘本身很忙(%util接近100%),还是单个I/O请求延迟高(await值大)。
# 每2秒输出一次系统概况,共输出5次vmstat 2 5# 查看所有磁盘的详细I/O统计iostat -x 1
- 核心逻辑:vmstat看整体,iostat看局部。两者搭配,任何硬件级瓶颈都无所遁形。
- 实战案例:某次数据库慢查询,iostat显示
sda %util只有30%但await高达200ms,说明是磁盘本身响应慢(可能是硬件故障或RAID卡问题),而非I/O压力大。
🔍 3. pidstat 与 strace:进程级的“显微镜”
当top告诉你某个进程占用过高,下一步就是进程级精细诊断。pidstat -u -p [PID] 1能实时显示该进程的CPU使用率、上下文切换次数。上下文切换过高(比如每秒上万次),往往是锁竞争或线程数过多的信号。
而strace -p [PID]则是追踪系统调用的利器。比如发现一个进程疯狂调用read()或write(),那大概率是磁盘I/O频繁;如果全是clock_gettime(),可能是日志输出太猛。
# 查看PID为1234的进程每秒上下文切换pidstat -w -p 1234 1# 追踪进程的系统调用,只输出文件相关strace -e trace=file -p 1234
🚨 注意:strace在高频调用的进程上会产生巨大性能开销,生产环境慎用,建议先看pidstat缩小范围。
🌐 4. ss 与 netstat:网络连接的“照妖镜”
2026年的网络环境比十年前复杂得多。netstat是经典,但ss才是现在的高性能替代。执行ss -tuln查看所有监听端口,ss -s查看连接统计,几秒内就能发现异常连接数。
实战中,我最常用的是ss -tanp | grep TIME_WAIT | wc -l来统计TIME_WAIT连接数。当这个数字超过几万,基本可以判断是短连接过多或连接池配置不当。对于后端服务,你要么调大tcp_tw_reuse和tcp_fin_timeout,要么改用长连接。
# 查看所有ESTABLISHED状态的连接ss -tan state established# 显示每个连接的进程PIDss -tanp | grep :80
- ps:
ss比netstat快得多,尤其在连接数上万时。 - 核心指标:
TIME_WAIT、CLOSE_WAIT、SYN_SENT——这三个状态异常,基本就是网络问题的根源。
📈 5. sar:历史数据的“时光机”
如果线上故障已经过去,或者你想了解过去24小时的系统状态,