0%

High CPU定位---gstack

模拟程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <chat_global.hpp>
#include <thread>
#include <chrono>

void func(int i)
{
PRINT_INFO("thread " << i << " start...");
while(1)
{
PRINT_INFO("thread " << i << " run...");
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}

void func_high_cpu()
{
PRINT_INFO("thread high cpu test start...");
while(1)
{

}
}

int main(int argc, char const *argv[])
{
/* code */
std::thread t1(func, 1);

std::thread t2(func, 2);

std::thread t3(func, 3);

std::thread t4(func_high_cpu);

t1.join();
t2.join();
t3.join();
t4.join();

return 0;
}

# 编译时没带 -g 选项

运行模拟程序


top

查看 high cpu 进程 id:

1
$ top
  • high cpu 进程 id: 8521

top -H -p pid

查看进程内各个线程占用的CPU百分比

1
$ top -H -p 8521
  • 可确认 high cpu 线程 id: 8525

gstack pid > pid.log

打印进程中各线程的函数调用栈信息

1
2
3
$ sudo gstack 8521 > 8521.log

#save ---> 8521.log

根据线程 id 8525 确认调用栈信息:

根据调用栈信息,结合源代码分析,根据上述步骤已基本定位到调用函数。


strace

查看系统调用和耗时时间

1
$ sudo strace -T -r -c -p 8521

统计信息需等进程结束才会打印

gstack安装方法:Ubuntu安装gstack