Linux下如何定位高CPU/Memory的代码段

    先前自开发的过程中解决过一个CPU使用过高的问题,没有记录,今天以FreeSWITCH为例,把解决的过程写下来,方便以后有类似问题参考解决。

    注:因为不是真正解决问题的过程,所以CPU的数据会和真实的有差距。

    1、我们发现正在运行的FreeSWITCH程序占用的CPU过高,需要确定哪段代码引起,首先,找到FS的进程号:

          

2、通过top -H -p产看进程中所有线程对应的线程:

    

上图所有的线程CPU是一样的,因为没有电话进来,如果有错误,会有对应的线程CPU过高。

3、通过GBD获取对应的堆栈,gdb attach 18258,并通过infor threads命令获得所有的线程如下图:

从上图中我们可以看到gdb里面对应的thread号码1-34与系统中线程号18258到18311的对应关系。

4、假如前面通过top -H -p查看到得CPU使用过高的线程为:18312,那么对应的号码为:9.我们可以通过GDB中的 thread 9切换到线程的堆栈中,并通过 bt 命令产看目前的堆栈信息。具体的如下图:

    

5、通过strace产看程序中,哪些调用占用的时间最长,并对着堆栈和源码找出原因。(注:因为我截图的FS没有问题,所以看到的是正常的值)

      命令如下:strace -c -f -T -p 18258

     效果图如下:

    

因为程序运行是正常的,所以所有的时间都在 select/epoll_wait/read等系统调用上,如果异常的话,会有其他函数出现。

总结:这个文章讲解一个解决CPU过高或者内存过高的一个思路,具体的问题需要具体分析。

 

转载于:https://my.oschina.net/andywang1988/blog/698603

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值