本节介绍如何利用CoreDump文件分析哪个函数占用CPU多。听起来有些离奇,CoreDump是系统出现问题时自动产生的CoreDump文件,可以分析出现问题时候的函数调用栈,怎么就可以分析哪个函数占用CPU多呢?
思路:人为产生CoreDump文件(kill -3那个占用CPU最多的Java线程,kill -3 pid表示发送信号3也就是SIGQUIT给进程pid。kill -9 就是发信号9也就是SIGKILL),分析那个时刻,线程执行到了哪个函数。然后,隔一段时间产生一次CoreDump文件(因为CoreDump文件很大,产生CoreDump文件需要消耗时间、CPU、IO资源,因此需要隔一段时间),产生N个CoreDump后,分析他们都停到了哪个函数。如果10个CoreDump里,有4-5个都停到了同一个函数,从统计的角度可以说明,至少40-50%的CPU时间片是被这个函数占用的。
对于java程序,nmon中可以看到的函数级最低就是java,占用CPU最多的就是java进程。至于java里面什么函数占用CPU多并不清楚,此时CoreDump文件就要大展身手了。
对于C程序,也可以产生CoreDump,并采用dbx分析,但需要用源程序的配合。
本节重点介绍Java程序的分析方法。
1、 产生Core文件
Topas 找到占cpu最大的进程(比如5046286),ps -mp 5046286 -o THREAD 以查找当前进程中占用 CPU较高的线程信息,记录线程号
kill -3 5046286 产生core dump文件,重复做1~3步 半分钟一次,执行多次
找到javacore和heapdump
find / -name javacore.20131228.*
查看javacore.xxx.xxx.xxx.txt文件,取上面找到的CPU高的线程号,转换为16进制的数据,39715049转换16进制值为0x25E00E9,可以使用windows的“计算器”工具,先输入10进制数值,然后切换到16进制。
找0x25E00E9在javacore.20120322.130602.6619258.0003.txt中对象的日志:
多个core文件,按照上述方法,一一分析。
2、Core文件分析
在8个时间点的core文件中,有5个core的最大的线程是同一个,且线程中正在执行的函数是同一个, TableOutput.run(TableOutput.java:43(Compiled Code)),这个函数占了整个CPU的53~90%。
3、问题分析
应用在保存数据时,如果查询的条数不超过1000条,则一直不保存,这种情况下,一直在进行循环。这个是比较浪费CPU的。
4、问题解决
在不满足条件时,加入sleep,问题解决