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

亡梦爱人 提交于 2019-12-10 15:06:40

    先前自开发的过程中解决过一个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过高或者内存过高的一个思路,具体的问题需要具体分析。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!