背景
某天凌晨,告警群突然弹出:某核心服务 CPU 使用率持续 95% 以上。实例响应变慢,接口超时率从 0.1% 飙升到 8%。本文复盘整个排查链路。
排查步骤
1. 定位高负载进程
1 | top -c # 找出 CPU 占用最高的进程 PID |
确认是该 Java 服务进程,单核占用接近 100%。
2. 找出罪魁祸首线程
1 | top -Hp <PID> # 查看该进程内各线程 CPU 占用 |
3. 抓取线程堆栈
1 | jstack <PID> | grep -A 30 <16进制TID> |
发现大量线程卡在一个正则表达式的匹配逻辑上——一个用户输入触发了「灾难性回溯(ReDoS)」。
4. 根因与修复
- 根因:对用户输入直接套用复杂正则,未做长度与字符白名单限制。
- 修复:收紧正则、增加输入长度上限、对超长请求直接拒绝。
- 加固:在网关层增加单 IP 限流与 WAF 规则。
小结
CPU 飙高八成是「某段代码在死循环 / 复杂计算 / 锁竞争」。先 top 定位进程,再 top -Hp 定位线程,最后 jstack 看堆栈,这条链路能解决 80% 的类似问题。