什么场景需要排查CPU占用?
系统访问慢,卡顿,超时时
核查步骤
定位进程(命令:top)
定位线程(命令:top -Hp PID)
定位代码位置(命令:jstack)
思路:
- top定位导致CPU利用率过高的进程,当然也可能不是自己服务的进程
- 如果是其他进程,那这个情况多了
- 如果是Java服务进程,就需要看看线程情况
定位进程
top 命令
找到PID,当然也可用ps -ef | grep java找
PID为:64421
定位线程
top -Hp PID
top -Hp 64421 然后按P(以 CPU 占用率大小的顺序排列进程列表)
线程PID 64427
定位代码 jstack
也可以将其转换为16进制形式(因为 java native 线程以16进制形式输出)
printf %x 64427
[root@wkties20220629prod1 ~]# printf %x 64427
fbab
jstack java进程PID | grep 上面输出的字符串 -A 30 --color
如:jstack 64421 | grep fbab -A 30 --color
或者使用jstack 64421打印出所有线程栈日志,然后使用线程名称搜索
场景导致CPU狂飙的场景
- 死循环
- 频繁GC
- 竞争锁,频繁切换上下文
- 序列化和发序列号;正则表达式匹配
END