面试连环炮系列(八):服务器CPU飙升100%怎么排查
程序员文章站
2023-11-23 08:01:09
服务器CPU飙升100%怎么排查,Java应用导致的100%怎么定位故障原因,full gc有哪些原因 ......
服务器cpu飙升100%怎么排查
执行“top”命令,查看当前进程cpu占用的实时情况,pid列是进程号,确定是哪个应用程序的问题。-
如果是java应用导致的,怎么定位故障原因
- 执行“top -hp 进程号”命令:查看java进程下的所有线程占cpu的情况。
- 执行“printf "%x\n 10"命令 :后续查看线程堆栈信息展示的都是十六进制,为了找到咱们的线程堆栈信息,把线程号转成16进制。例如,printf "%x\n 10-》打印:a,那么在jstack中线程号就是0xa。
- 执行 “jstack 进程号 | grep 线程id” 查找某进程下-》线程id(jstack堆栈信息中的nid)=0xa的线程堆栈信息。如果“"vm thread" os_prio=0 。tid=0x00007f871806e000 nid=0xa runnable”,第一个双引号圈起来的就是线程名,如果是“vm thread”这就是虚拟机gc回收线程了。
- 执行“jstat -gcutil 进程号 统计间隔毫秒 统计次数(缺省代表一致统计)”,查看某进程gc持续变化情况,如果发现返回中fgc很大且一直增大-》确认full gc! 也可以使用“jmap -heap 进程id”查看一下进程的堆内从是不是要溢出了,特别是老年代内从使用情况一般是达到阈值(具体看垃圾回收器和启动时配置的阈值)就会进程full gc。
- 执行“jmap -dump:format=b,file=filename 进程id”,导出某进程下内存heap输出到文件中。可以通过eclipse的mat工具查看内存中有哪些对象数量比较多。
-
频繁full gc有几种原因
- 创建大量对象而无法回收。
- 频繁显示调用system.gc()。
如果是死锁,怎么检查呢
执行 “jstack 进程号 | grep 线程id” 查找对应的线程堆栈信息,出现deadlock关键字就表示发生了死锁,通过堆栈信息能看到两个线程的具体阻塞点。
参考(部分摘抄的文字版权属于原作者):
https://mp.weixin.qq.com/s/g8kjhotibhwb6wnfrcclvg
鸡汤:别减肥了,你丑并不只是因为胖。
上一篇: Seata为什么效率高