4.6.4 性能瓶颈定位流程与案例
性能瓶颈定位流程与案例#
一、定位流程(从现象到根因)#
步骤说明与关键命令
1. 确认现象与范围:记录高负载时间点、持续时间、影响面。
2. 快速判定资源瓶颈方向:
- uptime:查看 load average
- top/htop:看 %us/%sy/%wa 和进程消耗
- vmstat 1:看运行队列 r、上下文切换 cs
3. 区分系统态与用户态:pidstat -u 看 %usr/%system/%iowait
4. 定位到进程/线程:top -H -p <pid> 或 pidstat -t -p <pid>
5. 热点函数与调用栈:perf top/record/report
6. 交叉验证:结合应用日志、JVM 指标、磁盘/网络指标
7. 实施优化与回归:参数优化或代码修复,验证指标恢复并建立基线
二、工具安装与环境准备(示例)#
以下示例以 CentOS/Ubuntu 为例,建议在问题发生前预装工具。
# CentOS/RHEL
sudo yum install -y perf sysstat htop
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y linux-tools-common linux-tools-generic sysstat htop
启用 sysstat 采集历史趋势:
# 启动并设置开机自启
sudo systemctl enable --now sysstat
# 预期效果:/var/log/sa/ 生成历史采样文件
ls /var/log/sa/
三、关键命令与明确解释(示例)#
# 1) 确认负载与时间
uptime
# 输出示例:load average: 5.28, 5.91, 6.12
# 解释:数值持续高于 CPU 核心数,可能存在瓶颈
# 2) 快速观察 CPU 态与高耗进程
top
# 解释:%us 用户态, %sy 内核态, %wa I/O等待
# 3) 采样运行队列与上下文切换
vmstat 1 5
# 解释:r=运行队列,cs=上下文切换
# 4) 精确到进程/线程
pidstat -u -p 1234 1
pidstat -t -p 1234 1
# 解释:-t 显示线程级 CPU 使用
# 5) 内核/函数热点
sudo perf top
# 解释:实时显示最耗 CPU 的函数
# 6) 生成调用栈分析
sudo perf record -F 99 -g -p 1234 -- sleep 30
sudo perf report
# 解释:-g 捕获调用栈,定位热点函数链路
# 7) 历史趋势
sar -u 1 5
# 解释:查看历史 CPU 使用趋势
四、案例一:系统态 CPU 高导致负载飙升(含排错)#
现象:load average 高,top 显示 %sy 40%+
排错步骤:
# 1) 确认内核态占比
top
# 2) 检查上下文切换是否异常
vmstat 1 5
# 3) perf 查内核热点
sudo perf top
# 常见热点: __schedule, mutex_lock
原因定位:短连接频繁创建/销毁,内核调度开销高
优化示例:
# 临时调优:提高连接队列
sudo sysctl -w net.core.somaxconn=1024
# 允许 TIME_WAIT 复用(谨慎,需业务评估)
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# 持久化写入
cat <<'EOF' | sudo tee /etc/sysctl.d/99-tuning.conf
net.core.somaxconn = 1024
net.ipv4.tcp_tw_reuse = 1
EOF
sudo sysctl -p /etc/sysctl.d/99-tuning.conf
结果:%sy 下降,负载回落
验证:对比调优前后 sar -u 1 5 与 uptime
五、案例二:用户态 CPU 高导致请求超时(含排错)#
现象:%us 过高,响应时间增大
排错步骤:
# 1) 线程级定位
top -H -p 5678
# 2) 采样热点函数
sudo perf record -F 99 -g -p 5678 -- sleep 20
sudo perf report
原因定位:JSON 解析函数占比过高
优化示例:缓存解析结果、合并/精简字段
验证:请求延迟下降,perf report 中该函数占比明显降低
六、案例三:CPU 利用率不高但负载高(含排错)#
现象:load average 高但 %us 仅 30%
排错步骤:
# 1) 查看 I/O 等待
vmstat 1 5
# 2) 磁盘性能排查
iostat -x 1 5
# 关键字段:await、svctm、%util
原因定位:磁盘 I/O 阻塞导致进程不可中断
优化示例:
- 更换磁盘或分离日志盘
- 减少同步写
验证:iostat -x 中 await 明显下降,负载恢复正常
七、常见排错清单(快速定位)#
load high + %sy high:内核调度/锁争用/短连接load high + %wa high:磁盘/网络 I/Oload high + CPU低:I/O 阻塞或锁等待load high + %us high:应用逻辑热函数
八、练习与自检#
- 练习一:制造 CPU 高负载并定位
# 生成 CPU 负载
yes > /dev/null &
# 定位进程
top
# 停止负载
pkill yes
- 练习二:perf 热点采样
# 对当前 shell 执行 10 秒采样
sudo perf record -F 99 -g -p $$ -- sleep 10
sudo perf report
- 练习三:复盘流程
写出从告警到根因的完整流程,并列出至少 5 条证据链。