现在随便一台服务器就是24核cpu,128GB内存,程序的线程数也开得多,各个线程还都干不同的事情。线程数一多,某些问题可能就隐藏起来了, 可能几百个线程中有那么一两个线程因某些特殊的请求,走到死循环里了,表面却看不出什么问题,处理能力也无明显变化。 下面记录一下如何定位高cpu占用的线程。
首先弄懂一个概念,轻量级进程(LWP, light weight process),也就是Linux下的线程,跟windows不同,Linux下的线程跟进程差别不大, 所以一个进程的ID号,其实就是该进程中主线程的线程ID号,所谓的lwp ID。
pstree 18067 -p
参数-p
就表示显示pid的意思。
输出如图:
图中花括号表示线程,后面的圆括号就是pid,或者叫做lwp id。
top -p 18067
然后再按H
,线程就会展开显示(注意:老版本的top可能不支持)。如图:
这样就可以看到每个线程的cpu占用了。
ps -eLf | grep "myse\|UID"
结果如图:
图中C
表示cpu占用,LWP
就表示lwp id,NLWP
表示总线程数,TIME
表示累计占用cpu时间。
假设发现18073这个线程占用cpu非常高,在gdb中使用info threads
命令就可以找到该线程在调试状态下对应编号。大体使用的命令依次如下:
gdb ./bin/myse
attach 18067
info threads
thread 5
bt
定位之后当然就得一步一步调试发现问题了。