运维

运维篇:一次生产环境 CPU 飙高排查实战

2026-08-18 #运维#故障排查#性能优化

背景

某天凌晨,告警群突然弹出:某核心服务 CPU 使用率持续 95% 以上。实例响应变慢,接口超时率从 0.1% 飙升到 8%。本文复盘整个排查链路。

排查步骤

1. 定位高负载进程

1
2
top -c          # 找出 CPU 占用最高的进程 PID
pidstat -u -p <PID> 1

确认是该 Java 服务进程,单核占用接近 100%。

2. 找出罪魁祸首线程

1
2
top -Hp <PID>   # 查看该进程内各线程 CPU 占用
printf "%x\n" <TID> # 转成 16 进制,用于匹配堆栈

3. 抓取线程堆栈

1
jstack <PID> | grep -A 30 <16进制TID>

发现大量线程卡在一个正则表达式的匹配逻辑上——一个用户输入触发了「灾难性回溯(ReDoS)」。

4. 根因与修复

  • 根因:对用户输入直接套用复杂正则,未做长度与字符白名单限制。
  • 修复:收紧正则、增加输入长度上限、对超长请求直接拒绝。
  • 加固:在网关层增加单 IP 限流与 WAF 规则。

小结

CPU 飙高八成是「某段代码在死循环 / 复杂计算 / 锁竞争」。先 top 定位进程,再 top -Hp 定位线程,最后 jstack 看堆栈,这条链路能解决 80% 的类似问题。

评论
分享