性能指标之资源指标-谁占用了CPU-函数级-CoreDump

本节介绍如何利用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,问题解决


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值