Linux 性能排查实战:从 load 到 CPU/内存/IO/网络逐层定位瓶颈
一、排查性能问题的正确姿势
线上服务变慢,第一反应往往是“加机器”,但真正高效的做法是先定位瓶颈,再对症下药。Linux 提供了大量观测工具,关键不是记住所有命令,而是建立一套“从整体到局部、从 CPU/内存/磁盘/网络四个维度逐步缩小范围”的排查思路。
本文按“先看整体负载,再逐层下钻”的顺序,讲清楚最常用的命令与判断方法。
二、先看整体:load average 与 top
uptime
# 12:00:00 up 3 days, load average: 1.20, 0.98, 0.75
load average 三个数分别是 1/5/15 分钟的平均负载。关键要与 CPU 核数对比:4 核机器上 load 长期 > 4,说明任务排队严重。load 高不一定是 CPU 忙,也可能是大量进程在等 IO。
top
top 里重点看:
%Cpu(s):us(用户态)、sy(内核态)、wa(IO 等待)、id(空闲)。wa高说明瓶颈在磁盘/IO,不是 CPU。load average与%CPU总量是否吻合。- 按
P按 CPU 排序、按M按内存排序,快速找“大户”。
三、CPU 排查
# 每个核的使用率,判断是否个别核被打满(单线程瓶颈)
mpstat -P ALL 1
# 看进程内哪个线程最耗 CPU
top -H -p <pid>
# 采样看函数级热点(需 perf)
perf top -p <pid>
判断要点:
- 多核整体高 → 并发量大或计算密集,考虑水平扩容或优化算法。
- 单核高、其它核闲 → 典型串行瓶颈(如单线程处理、锁竞争),要优化并发模型。
sy特别高 → 系统调用频繁(如大量小文件 IO、频繁上下文切换),vmstat的cs(上下文切换)可佐证。
四、内存排查
free -h
vmstat 1
free的available才是“真正可用内存”,buff/cache可回收,不必因为 free 小而紧张。vmstat的si/so(swap 换入换出)持续非 0 → 内存不足已在用 swap,性能会急剧下降。- 找内存大户:
ps aux --sort=-%mem | head
若是 Java 应用,还要看堆:jmap -heap <pid>、jstat -gcutil <pid> 1000,警惕频繁 Full GC。
五、磁盘 IO 排查
iostat -x 1
重点看:
%util:设备繁忙度,长期接近 100% 说明磁盘被打满。await:平均 IO 等待时间(ms),越大越慢。r/s、w/s:每秒读写次数,随机小 IO 多会显著拖慢。
找是哪个进程在狂读写:
iotop -o
常见优化:把随机 IO 变顺序(日志追加)、加缓存、拆分热点盘、换 SSD。
六、网络排查
ss -s # 连接数汇总
ss -tnp | head # 查看 ESTABLISHED/大量 TIME_WAIT
sar -n DEV 1 # 网卡吞吐
- 大量
TIME_WAIT→ 短连接过多,考虑连接复用(keep-alive/连接池)。 CLOSE_WAIT堆积 → 应用没正确关闭连接,往往是代码 bug。- 排查丢包/延迟:
ping、mtr、traceroute。
七、一把梭:先跑这几个
不确定从哪查时,按这个顺序快速过一遍:
uptime # 整体负载
dmesg -T | tail # 有无 OOM、硬件告警
vmstat 1 5 # CPU/内存/swap/上下文切换
iostat -x 1 3 # 磁盘繁忙与 await
ss -s # 连接数
基本能在 1–2 分钟内判断瓶颈是 CPU、内存、IO 还是网络。
八、几个常见误区
- 只看 CPU 不看 wa:
wa高却去扩 CPU,钱花了问题还在。 - 看到 free 小就以为内存不足:忽略
buff/cache可回收。 - load 高就断定 CPU 忙:load 也统计不可中断睡眠(D 状态,多在等 IO)。
- 忽略 OOM:
dmesg里若有Out of memory: Killed process,说明进程被内核杀过。 - 不保留现场:问题复现时先抓
top/iostat/ss快照和进程栈,再重启,否则事后无从分析。
九、总结
Linux 性能排查的核心方法论是:先看整体(uptime/top 的 load 与 wa),再按 CPU→内存→磁盘IO→网络四维逐层下钻,用 mpstat/iostat/vmstat/ss 等工具定位到具体资源与进程。记住几个关键判据(wa 高=IO、si/so 非0=内存紧张、单核满=串行瓶颈、CLOSE_WAIT 堆积=连接未关),就能快速从“感觉慢”定位到“具体哪里慢”,避免盲目扩容。
- 点赞
- 收藏
- 关注作者
评论(0)