当线上业务服务器的 CPU 使用率突然升高时,你会按照怎样的步骤进行排查?
考察说明
考察候选人面对线上CPU飙升问题的排查思路和实操能力。
回答思路
- 【回答框架 1】CPU飙升的核心是定位占用CPU高的进程和线程。先用 top 或 htop 找到CPU占用最高的进程,再用 ps -Lp 或 top -Hp 找出该进程内的高CPU线程。
- 【回答框架 2】将高CPU线程ID转换为十六进制,使用 jstack 对Java进程输出线程栈,在dump文件中搜索该十六进制ID对应的线程,定位到具体代码行,如循环、锁竞争或GC线程。
- 【回答框架 3】若定位到GC线程,需进一步分析GC日志,查看是否频繁Full GC,使用 jstat 或命令行工具检查堆内存使用情况,判断是否存在内存泄漏或参数配置不当。
- 【回答框架 4】若线程栈指向业务代码,检查是否存在死循环、高频日志输出、大对象分配或正则回溯等问题,结合代码审查和最近变更,如发布或配置调整。
- 【回答框架 5】使用火焰图或Perf工具进行更细致的性能剖析,获取CPU采样热点,辅助确认优化点。最后根据定位结果实施针对性优化,并观察恢复情况。
- 【关键点 1】使用top或htop定位高CPU进程,用ps -Lp定位高CPU线程ID。
- 【关键点 2】将线程ID转十六进制后,用jstack dump线程栈,定位到具体代码行。
- 【关键点 3】区分是GC线程还是业务线程,GC频繁时优先分析堆内存和GC日志。
- 【关键点 4】业务线程需排查死循环、正则回溯、锁竞争、高频日志等常见问题。
- 【关键点 5】可通过火焰图或Perf进一步采样热点,优化后需观察验证。
- 【易错点 1】只关注进程而忽略线程,导致无法定位具体代码。
- 【易错点 2】盲目重启服务,丢失现场信息,难以根因分析。
- 【易错点 3】忽略最近发布变更,浪费排查时间在历史代码上。