用Process Explorer分析进程各个线程CPU占用率
使用Process Explorer可以很方便查看某个进程各个线程的CPU占用率,可以为排查问题提供帮助。我使用的Process Explorer版本是v16.21 64bit。
使用VS 2008创建一个MFC对话框程序,在代码中创建两个线程,如下:
m_thread = (HANDLE)_beginthreadex(NULL,1024,m_thread_func,(void*)this,NULL,&m_rcvthreadid); unsigned int thradii ; HANDLE m_thread2 = (HANDLE)_beginthreadex(NULL,1024,m_thread_func2,(void*)this,NULL,&thradii); char sss[128]; sprintf(sss,"thread %d ,thread %d.",m_rcvthreadid,thradii); MessageBox(sss,"",MB_OK);
代码中,我们把两个线程的TID打印出来,方便对照。
两个线程的内容如下:
UINT WINAPI m_thread_func(void *param_) { while(1) { } return 0; } UINT WINAPI m_thread_func2(void *param_) { int cunt = 0; while(1) { if(cunt++ %4096 == 0) Sleep(1); } return 0; }
其中一个线程什么都不做,死循环,也不休眠,我们猜测这样会占用一个CPU线程满负荷运行;另一个线程隔一段时间休眠1ms,我们猜测这个线程基本不会占CPU。
运行:
第一个死循环不休眠的TID是296,第二个线程TID是2920.
然后我们打开Process Exploer:
我们看到进程占了12.51%的CPU,我们想知道到底是哪个线程占用的,在该进程上右键,选择Properties...:
切换到Threads标签页,可以看到绝大部分CPU是被TID为296的线程占用,而296正是我们创建的第一个线程,死循环,不休眠,因为我的电脑是i7-2630QM,4核心,8线程,因此它占了1/8,也即0.125 = 12.5%。点击Stack,可以查看某个线程此时的运行堆栈。
下一篇:
在Mac上安装使用Charles