当前位置: 技术问答>linux和unix
如何查找CPU占用率较高的线程是哪一个?
来源: 互联网 发布时间:2017-01-20
本文导语: 某一个线程CPU占用率较高,导致应用程序响应缓慢,如何才能够找到罪魁祸首? 在/proc文件系统中,有该进程的相关信息,进入task子目录,里面是所有的线程信息。 依次进入各个线程的子目录,打开status文件,里面...
某一个线程CPU占用率较高,导致应用程序响应缓慢,如何才能够找到罪魁祸首?
在/proc文件系统中,有该进程的相关信息,进入task子目录,里面是所有的线程信息。
依次进入各个线程的子目录,打开status文件,里面有SleepAVG的字样,如果后面的值较小则说明线程比较繁忙。
我这里有一个线程的SleepAVG是0%,持续的,感觉像是死循环。
但是没法儿找到具体是哪一个线程,有没有好办法?
在/proc文件系统中,有该进程的相关信息,进入task子目录,里面是所有的线程信息。
依次进入各个线程的子目录,打开status文件,里面有SleepAVG的字样,如果后面的值较小则说明线程比较繁忙。
我这里有一个线程的SleepAVG是0%,持续的,感觉像是死循环。
但是没法儿找到具体是哪一个线程,有没有好办法?
|
一般情况下,可以通过top或者ps指令获取某进程相关的线程信息,这取决于你具体使用的线程库(如:NTPL)。
同时,这里也存在限制,你很难知道具体是对应你的代码中的哪个线程。
1. 简单做就是线程中dead loop时的打印,通过打印的频度就可以知道哪个线程负荷较重;
·实现简单,也比较笨。
2. 比较根本的办法是为每个线程设定一个名称,然后在proc文件系统中查看线程的信息,根据线程名称来定位
·实现简单,比较根本。
同时,这里也存在限制,你很难知道具体是对应你的代码中的哪个线程。
1. 简单做就是线程中dead loop时的打印,通过打印的频度就可以知道哪个线程负荷较重;
·实现简单,也比较笨。
2. 比较根本的办法是为每个线程设定一个名称,然后在proc文件系统中查看线程的信息,根据线程名称来定位
·实现简单,比较根本。
// 在线程入口处执行下面代码
prctl ( PR_SET_NAME, ( unsigned long ) "yourTask" );
1. ps -ef |grep YourProcName
2. cd /proc/$PID/task
3. for pid in `ls`
do
echo "========= $pid ========="
cat $pid/status |grep Name
done
// 这样就获取了名称与ID的绑定关系
4. for pid in `ls`
do
echo "========= $pid ========="
cat $pid/status |grep SleepAVG
done
// 这样就获取了CP负荷与ID的关系
5. 对照3/4,就可以知道是哪个具体的线程CP负荷较高了。
|
top -H
H 开关可以列出线程. PID将是线程ID.
不加选项起动top后, 再键入'H'也可以.
H 开关可以列出线程. PID将是线程ID.
不加选项起动top后, 再键入'H'也可以.
|
我想了一下还真没找到办法,期待高手,主要是要知道pthread_t和task里面的文件夹名是如何对应的
|
不会开发 不太懂
如果是自己写的代码 多斟酌一些自己的代码啊
如果是自己写的代码 多斟酌一些自己的代码啊
|
为什么不用gdb调试下呢?
|
你用top命令看不到吗?
|
为什么不用gdb调试下呢?