Linux 性能排查:CPU/内存/磁盘/网络一条龙
服务器“变慢”时,最容易犯的错就是:第一反应重启。重启确实能“治标”,但你会永远不知道根因是什么——下次还会慢。
这篇我把常见的性能排查流程整理成一条线:从“现象”到“指标”,再到“定位到进程/线程”,最后给出一份可以直接照着走的命令清单。
一句话原则:先量化,再定位
你要回答的核心问题只有 3 个:
- 慢在哪里:CPU?IO?网络?锁竞争?还是外部依赖?
- 慢到什么程度:是否真的异常(对比历史/基线)?
- 是谁在慢:哪一个进程、哪一类请求、哪条链路?
第 0 步:确认“慢”的表现(别凭感觉)
建议先记录三类信息(越快越好):
- 时间窗:从什么时候开始慢?是否和发布/定时任务/流量波动有关?
- 范围:全机慢还是某个服务慢?只慢写入还是读也慢?
- 症状:接口超时、CPU 飙高、磁盘打满、连接数暴涨、负载飙高……
第 1 步:看整体健康(30 秒内必须得到判断)
1 | # 1) 负载与运行时间 |
负载(Load Average)怎么理解?
- Load 不是 CPU 使用率,它更像“排队的人数”(可运行 + 不可中断 IO 等待)。
- 经验判断:
load > CPU 核心数并不一定坏,但如果同时 iowait 高 或 响应时间上升,就要警惕。
第 2 步:CPU 排查(算力不够 / 线程打架 / 上下文切换)
1 | # 以“每秒刷新”观察趋势 |
重点盯这些信号:
- us 高:用户态计算重(编码/压缩/加密/序列化/大循环)
- sy 高:系统调用重(大量网络/文件操作、频繁创建销毁对象)
- wa 高:IO 等待(磁盘/网络存储慢)——这时 CPU 可能并不“忙”,但任务卡在等 IO
- cs(上下文切换)异常:线程太多、锁竞争严重
小技巧:如果你看到 load 很高,但 CPU us/sy 不高、wa 很高,优先怀疑 IO。
第 3 步:内存排查(泄漏 / 缓存挤压 / 频繁换页)
1 | # 内存概览(重点看 available,而不是 free) |
怎么看 free -h:
- available 才是关键:表示在不明显影响系统的情况下还能“借出来”的内存(含可回收的 page cache)。
- swap 在增长 且系统变卡:十有八九是内存压力/泄漏/误配。
怎么看 vmstat:
si/so(swap in/out)持续非 0:说明在换页,性能通常会明显下降。r(run queue)高:说明 CPU 竞争激烈或任务积压。
第 4 步:磁盘/IO 排查(最常见的“暗杀者”)
1 | # iostat 观察磁盘队列与延迟 |
iostat -xz 里最值得看:
- %util:接近 100% 说明设备接近饱和(不等于一定慢,但通常要警惕)
- await:请求平均等待时间(延迟)
- r/s、w/s、rkB/s、wkB/s:吞吐与 IOPS 方向
常见坑:
- 磁盘没满,但 inode 满了:
df -i一眼看出 - 日志疯狂写:尤其是 debug 级别、每请求一条
- 容器 overlayfs:小文件写入会更吃亏,注意 volume 策略
第 5 步:网络排查(连接数、丢包、拥塞、DNS)
1 | # TCP/UDP 连接概览 |
如果你怀疑是外部依赖(数据库/缓存/第三方 API)导致:
- 先确认超时与重试策略是否合理
- 看连接池是否耗尽(大量等待连接)
- 看 DNS 是否抖动(偶发慢就是典型)
快速清单:你可以按这个顺序走
- 1 分钟:
uptime、top、df -h、df -i - 3 分钟:
vmstat 1、iostat -xz 1、ss -s - 5 分钟:
pidstat -u 1/pidstat -t -p PID 1定位到进程/线程 - 10 分钟:结合业务日志/链路追踪,回到“哪类请求慢”
总结
性能排查不是玄学,核心是:把“慢”拆到 CPU/内存/IO/网络四象限里,再下钻到进程/线程。你越早建立“基线”(正常时的指标范围),排障越快。
封面与配图来自 Unsplash(免费使用授权)。
- 标题: Linux 性能排查:CPU/内存/磁盘/网络一条龙
- 作者: 星苒鸭
- 创建于 : 2026-02-06 08:00:00
- 更新于 : 2026-03-05 19:20:55
- 链接: https://xingranya.cn/linux-performance-troubleshooting/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。