Linux下定位高cpu占用的线程

现在随便一台服务器就是24核cpu,128GB内存,程序的线程数也开得多,各个线程还都干不同的事情。线程数一多,某些问题可能就隐藏起来了, 可能几百个线程中有那么一两个线程因某些特殊的请求,走到死循环里了,表面却看不出什么问题,处理能力也无明显变化。 下面记录一下如何定位高cpu占用的线程。

首先弄懂一个概念,轻量级进程(LWP, light weight process),也就是Linux下的线程,跟windows不同,Linux下的线程跟进程差别不大, 所以一个进程的ID号,其实就是该进程中主线程的线程ID号,所谓的lwp ID。

查找一个进程的所有线程的lwp ID有很多方法

使用pstree命令

pstree 18067 -p

参数-p就表示显示pid的意思。

输出如图:

使用pstree命令

图中花括号表示线程,后面的圆括号就是pid,或者叫做lwp id。

使用top命令

top -p 18067

然后再按H,线程就会展开显示(注意:老版本的top可能不支持)。如图:

使用top命令

这样就可以看到每个线程的cpu占用了。

使用ps和grep命令

ps -eLf | grep "myse\|UID"

结果如图:

使用ps和grep命令

图中C表示cpu占用,LWP就表示lwp id,NLWP表示总线程数,TIME表示累计占用cpu时间。

找到问题线程使用gdb调试

假设发现18073这个线程占用cpu非常高,在gdb中使用info threads命令就可以找到该线程在调试状态下对应编号。大体使用的命令依次如下:

gdb ./bin/myse
attach 18067
info threads
thread 5
bt

定位之后当然就得一步一步调试发现问题了。

发表于 2014年06月07日 16:45   评论:0   阅读:3376  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo