Linux 性能瓶颈排查思路
1. 引言
在日常运维和开发过程中,我们经常会遇到 服务响应变慢、系统卡顿、吞吐下降 的问题。此时,盲目优化代码或重启服务,往往无法真正解决问题。
性能瓶颈排查 的意义在于:
- 快速定位问题:确定是硬件瓶颈、系统瓶颈还是应用层瓶颈。
- 节省成本:避免盲目扩容,先优化资源使用。
- 保障稳定性:及时发现潜在风险,减少宕机和服务中断。
因此,掌握一套系统化的性能瓶颈排查思路,是 Linux 运维和开发人员的必备技能。
2. 性能瓶颈排查思路
2.1 整体负载
命令:
uptime
作用:
查看系统运行时长、在线用户数,以及过去 1 分钟、5 分钟、15 分钟 的平均负载。
输出示例:
14:55:28 up 10 days, 5:23, 2 users, load average: 2.35, 2.18, 2.10
字段解释:
- up 10 days, 5:23 → 系统已运行 10 天 5 小时 23 分钟
- 2 users → 当前登录用户数
- load average → 系统平均负载(处于运行队列 R 或不可中断 D 状态的进程数)
判断方法:
- 单核 CPU 理想上限 ≈ 1.0
- 多核系统 =
CPU 核心数 × 1.0
- 经验公式:
load average ≤ CPU 核心数
→ 正常,否则需要排查
2.2 CPU 瓶颈
命令 1:
top -d 1
作用:
实时查看系统资源占用情况,默认按 CPU 使用率排序。
重点字段:
- %us → 用户态 CPU 占比(应用程序逻辑消耗)
- %sy → 内核态 CPU 占比(系统调用、上下文切换)
- %id → 空闲 CPU 百分比
- %wa → I/O 等待时间比例(高说明 CPU 在等磁盘/网络 I/O)
- PID / %CPU / COMMAND → 哪些进程最消耗 CPU
命令 2:
mpstat -P ALL 1
作用:
分 CPU 核心统计使用情况,排查是否存在 单核瓶颈。
字段解释:
- %usr → 用户态占比
- %sys → 内核态占比
- %iowait → 等待 I/O 时间
- %irq / %soft → 中断/软中断
- %idle → 空闲比例
命令 3:
pidstat -u 1
作用:
按进程维度统计 CPU 使用率,适合定位 具体耗 CPU 的进程。
字段解释:
- %usr → 用户态 CPU
- %system → 内核态 CPU
- %CPU → 总 CPU 占比
- Command → 对应进程名
异常场景:
- %us 高 → 程序逻辑复杂 / 算法效率低
- %sy 高 → 频繁系统调用 / 锁竞争
- %wa 高 → I/O 慢,CPU 被拖累
解决思路:
- 优化代码逻辑 / 算法
- 检查死循环、异常线程
- 降低不必要的系统调用
- 如果业务逻辑确实 CPU 密集 → 扩容 CPU 或分布式拆分
2.3 内存瓶颈
命令 1:
free -m
作用:
查看系统内存整体使用情况。
重点字段:
- total → 总内存
- used → 已用内存
- free → 空闲内存(Linux 下并非关键指标)
- available → 实际可用内存(关键)
- buffers/cache → 文件缓存占用
命令 2:
vmstat 1
作用:
查看内存、进程、CPU 状态。
重点字段:
- si/so → swap in/out,频繁发生说明物理内存不足
- r → 运行队列长度
- b → 阻塞进程数
异常场景:
available
内存持续过低si/so
频繁非零 → 系统在用交换分区
解决措施:
- 优化应用内存(缓存策略、释放不必要对象)
- 增加物理内存
- 调整 JVM/Xmx 等内存参数
2.4 磁盘 I/O 瓶颈
命令 1:
iostat -x 1
作用:
查看磁盘使用情况。
重点字段:
- %util → 磁盘利用率,接近 100% 表示磁盘打满
- await → 请求平均等待时间,>50ms 说明 I/O 延迟高
- r/s, w/s → 每秒读写次数
- rkB/s, wkB/s → 每秒读写 KB
命令 2:
iotop
作用:
实时查看哪个进程占用磁盘 I/O。
命令 3:
sar -d 1 10
作用:
统计一段时间的磁盘性能趋势。
异常场景:
%util
持续 100% → 磁盘性能瓶颈await
长时间高 → I/O 延迟过大
解决措施:
- 优化 SQL,减少随机 I/O
- 使用 SSD 替换 HDD
- 数据分片、缓存,分摊磁盘压力
2.5 网络瓶颈
命令 1:
iftop
作用:
实时显示网络流量的来源与去向。
命令 2:
sar -n DEV 1
作用:
统计网卡收发数据速率。
命令 3:
netstat -s
作用:
查看网络协议栈统计(丢包、重传情况)。
重点字段:
- rxpck/s / txpck/s → 每秒接收/发送包数
- rxkB/s / txkB/s → 每秒接收/发送字节数
- drop / retrans → 丢包、重传率
异常场景:
- 网络带宽接近链路上限
- 丢包率高,应用层出现超时
解决措施:
- 增加带宽 / 负载均衡
- 使用 CDN 缓解热点
- 排查异常流量(攻击、循环请求)
3. 应用层瓶颈
当 CPU、内存、磁盘、网络 都正常时,问题可能出在应用层:
- 算法复杂度过高(O(n²) 逻辑)
- 锁竞争严重(线程池、数据库连接池)
- SQL 查询慢(缺索引、全表扫描)
- 外部依赖(Redis、MQ、API)响应慢
解决措施:
- 引入 APM 工具(SkyWalking、Pinpoint、Prometheus + Grafana)
- 通过链路追踪快速定位瓶颈
- 优化业务逻辑、缓存策略
4. 流程总结
性能瓶颈排查是一项 自上而下 的过程:
- 先看系统整体负载(uptime)。
- 判断负载是否异常。
- 逐层排查 CPU → 内存 → 磁盘 I/O → 网络。
- 如果硬件层无瓶颈,继续检查应用层。
这样才能避免盲目扩容,快速找到问题根因。