2026-01-17 01:49:01
排查CPU飙高需分步骤确认是线程原因、线程数承载问题还是程序处理时间长导致,核心方法是通过工具定位负载类型、分析线程行为并验证调整效果。
一、确认CPU高负载类型通过top或htop查看用户态(User)与内核态(System)CPU占比:
top -c:按P键排序,找到CPU占用最高的进程(PID)。
htop:支持树形查看进程关系,按F6选择排序方式(如CPU占用)。
pidstat -u 1 5:每1秒输出一次,共5次,显示进程的CPU使用率。
非Java应用:top -H -p <PID>查看进程内线程CPU占用。
Java应用:jstack <PID> | grep -A20 "java.lang.Thread.State: RUNNABLE"查看运行中的线程。
每个核心同一时刻只能运行一个线程,多线程需通过上下文切换执行。
频繁切换会占用资源,导致响应速度下降。
程序中创建大量线程,或线程长期占用资源(如死循环)。
排查方法:
若利用率过高的线程一直是同一个,通过jstack获取线程堆栈,定位问题代码。
若利用率过高的线程不断变化,说明线程创建过多,需挑选几个线程通过堆栈排查。
线程创建过多导致资源竞争,或线程池配置不合理(如最大线程数设置过小)。
表现:系统资源(CPU、内存)被线程管理消耗,而非业务逻辑。
业务逻辑复杂(如频繁计算、全表扫描)导致单个线程执行时间过长。
表现:线程堆栈中存在长时间运行的逻辑(如递归未终止、阻塞操作)。
总结口诀: