一个应用占用CPU很高,除了确实是计算密集型应用以外,一般缘由都是出现了死循环。java
以咱们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。tomcat
根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。.net
经过ps aux | grep PID命令,能够进一步肯定是tomcat进程出现了问题。可是,怎么定位到具体线程或者代码呢?线程
首先显示线程列表:blog
ps -mp pid -o THREAD,tid,time进程
找到了耗时最高的线程28802,占用CPU时间快两个小时了!get
其次将须要的线程ID转换为16进制格式:it
printf "%x\n" tidclass
最后打印线程的堆栈信息:监控
jstack pid |grep tid -A 30
找到出现问题的代码了!
接下来就是具体分析代码:ShortSocketIO.readBytes(ShortSocketIO.java:106)
最后,总结下排查CPU故障的方法和技巧有哪些:
一、top命令:Linux命令。能够查看实时的CPU使用状况。也能够查看最近一段时间的CPU使用状况。
二、PS命令:Linux命令。强大的进程状态监控命令。能够查看进程以及进程中线程的当前CPU使用状况。属于当前状态的采样数据。
三、jstack:Java提供的命令。能够查看某个进程的当前线程栈运行状况。根据这个命令的输出能够定位某个进程的全部线程的当前运行状态、运行代码,以及是否死锁等等。
四、pstack:Linux命令。能够查看某个进程的当前线程栈运行状况。