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