查找多线程程序占用大量cpu资源过程
背景是我今天发布一个新的程序,刚更新完没两分钟,运维就发现有几个配置较低的服务器cpu负载很高,并确定以及肯定的告诉我就是我刚更新的程序导致的,随后便开始了一步一步的检查。
ps: 大牛就忽略此文吧,本文主要是记录下过程留着自己使用,以及刚出道的小弟弟or小妹妹正好遇到此问题摸不着头脑时候可以参考下
1. top之
当时哥就蒙圈了,为啥其他服务器好好的,这几台会出现问题,然后想到这个程序是多线程的,所以有了第二步。
2. top -p 32563 -H
既然已经知道是哪个线程占用的cpu资源,这就好办了,开始debug
3. import ctypes print "threaing id: ",ctypes.CDLL('libc.so.6').syscall(186)
把上面那条放到所执行的函数中就可以得到当前函数的线程id,(ps:那个186我不知道干嘛,等有空可以深入研究下,毕竟作者是个诚实耿直的boy。)光知道线程id还是远远不够滴,还需要知道所执行的函数名
4. print sys._getframe().f_code.co_name
这样就已经把问题范围缩小到了某个函数范围内,至于具体问题就因人而异了,具体问题我会发布另一篇文章供大家参考
在解决问题当中还学到不少其他东西,所以贴出来以备后用:
strace -p 29014 #跟踪线程所有的调用
pstack 4551 #进程栈跟踪
ps -mp pid -o THREAD,tid,time #显示线程列表
ss #命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等统计. 它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具