cpu飙高产生的原因
- CAS 自旋没有控制自旋次数
- 程序中存在死循环或者无限递归:如果程序中存在死循环或者无限递归,会导致 CPU不断执行相同的操作,造成 CPU 飙高
- 大量的线程竞争和锁等待:如果程序中存在大量的线程竞争和锁等待,CPU 在不断切换线程和处理锁等待的过程中会消耗大量的时间和资源,导致 CPU 使用率升高
- 服务器被 DDOS 工具攻击
- 频繁的垃圾回收:如果程序中存在内存泄漏或者频繁创建大量的临时对象,垃圾回收器就需要频繁进行垃圾回收操作,从而占用较高的 CPU 资源
- 长时间阻塞的 I/O 操作:如果程序中存在长时间阻塞的 I/O 操作(如网络请求、数据库查询等),CPU 可能会在等待这些操作完成时处于空闲状态,但是仍然会产生较高的 CPU 使用率
cpu飙升排查步骤
-
查找出耗用cpu最高的进程
// 展示所有进程占用情况 top // 展示CPU占用最高的5个进程 top -N 5 -
查找出占用cpu最高的线程id
top -H -p PID -
获取对应线程的线程栈信息
// 将线程ID转换为16进制 printf "%x\n" tid // 获取对应线程的线程栈信息 jstack 进程号 | grep 线程ID // 将今后所有堆栈信息都打印到stack.txt中 jstack 进程号 >> stack.txt