Linux 性能排查实战:从 load 到 CPU/内存/IO/网络逐层定位瓶颈

举报
yd_268144123 发表于 2026/11/04 10:37:43 2026/11/04
【摘要】 一、排查性能问题的正确姿势线上服务变慢,第一反应往往是“加机器”,但真正高效的做法是先定位瓶颈,再对症下药。Linux 提供了大量观测工具,关键不是记住所有命令,而是建立一套“从整体到局部、从 CPU/内存/磁盘/网络四个维度逐步缩小范围”的排查思路。本文按“先看整体负载,再逐层下钻”的顺序,讲清楚最常用的命令与判断方法。 二、先看整体:load average 与 topuptime# ...

一、排查性能问题的正确姿势

线上服务变慢,第一反应往往是“加机器”,但真正高效的做法是先定位瓶颈,再对症下药。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 还是网络。

八、几个常见误区

  1. 只看 CPU 不看 wa:wa 高却去扩 CPU,钱花了问题还在。
  2. 看到 free 小就以为内存不足:忽略 buff/cache 可回收。
  3. load 高就断定 CPU 忙:load 也统计不可中断睡眠(D 状态,多在等 IO)。
  4. 忽略 OOM:dmesg 里若有 Out of memory: Killed process,说明进程被内核杀过。
  5. 不保留现场:问题复现时先抓 top/iostat/ss 快照和进程栈,再重启,否则事后无从分析。

九、总结

Linux 性能排查的核心方法论是:先看整体(uptime/top 的 load 与 wa),再按 CPU→内存→磁盘IO→网络四维逐层下钻,用 mpstat/iostat/vmstat/ss 等工具定位到具体资源与进程。记住几个关键判据(wa 高=IO、si/so 非0=内存紧张、单核满=串行瓶颈、CLOSE_WAIT 堆积=连接未关),就能快速从“感觉慢”定位到“具体哪里慢”,避免盲目扩容。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。