如何查找CPU占用率较高的线程是哪一个?

踏岸寻柳 2010-08-17 06:47:27
某一个线程CPU占用率较高,导致应用程序响应缓慢,如何才能够找到罪魁祸首?

在/proc文件系统中,有该进程的相关信息,进入task子目录,里面是所有的线程信息。
依次进入各个线程的子目录,打开status文件,里面有SleepAVG的字样,如果后面的值较小则说明线程比较繁忙。

我这里有一个线程的SleepAVG是0%,持续的,感觉像是死循环。
但是没法儿找到具体是哪一个线程,有没有好办法?
...全文
3075 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linarin 2011-11-30
  • 打赏
  • 举报
回复
使用top -H查看哪线程占用CPU最高

再使用 pstack <pid>
打印各线程的调用栈就可知道了。
weiyan 2010-08-21
  • 打赏
  • 举报
回复
一般情况下,可以通过top或者ps指令获取某进程相关的线程信息,这取决于你具体使用的线程库(如:NTPL)。
同时,这里也存在限制,你很难知道具体是对应你的代码中的哪个线程。

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负荷较高了。
henry1981 2010-08-18
  • 打赏
  • 举报
回复
top -H
H 开关可以列出线程. PID将是线程ID.
不加选项起动top后, 再键入'H'也可以.
mars199 2010-08-17
  • 打赏
  • 举报
回复
为什么不用gdb调试下呢?
yzx714 2010-08-17
  • 打赏
  • 举报
回复
为什么不用gdb调试下呢?
steptodream 2010-08-17
  • 打赏
  • 举报
回复
不会开发 不太懂
如果是自己写的代码 多斟酌一些自己的代码啊
yzx714 2010-08-17
  • 打赏
  • 举报
回复
我想了一下还真没找到办法,期待高手,主要是要知道pthread_t和task里面的文件夹名是如何对应的
踏岸寻柳 2010-08-17
  • 打赏
  • 举报
回复
top看到的是进程。
我知道是哪个进程,但不清楚是该进程内部的哪个线程。

进程内部有自己的线程,也有的第三方的线程,目前难以撇清关系。
lzy0001sl 2010-08-17
  • 打赏
  • 举报
回复
你用top命令看不到吗?

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧