如何检测CPU热栈?

时间:2019-11-01 22:12:58

标签: linux performance stack cpu strace

我将通过Brendan Gregg的 USE 方法和性能实验室,您可以找到here和USE方法here。在实验1中,我运行top命令,并看到以下统计信息:

top - 14:12:21 up  6:52,  3 users,  load average: 1.00, 1.00, 1.00
Tasks: 177 total,   2 running, 142 sleeping,   0 stopped,   0 zombie
%Cpu(s): 98.7 us,  0.9 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.4 si,  0.0 st
KiB Mem :  2038768 total,   212784 free,   514224 used,  1311760 buff/cache
KiB Swap:   483800 total,   211392 free,   272408 used.  1341344 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
32130 connor    20   0    4372    788    728 R 97.7  0.0  71:59.53 lab001

非常明显,这是一个受CPU限制的问题,具体地说,该问题来自用户空间(正在运行某些应用程序)(在第3行us度量标准中可以看到)进一步分析,您会发现大部分CPU时间都闲置(您可以在第3行的id指标上看到这一点)。

很酷,所以这显然是CPU问题。但是,由于其中编写的C代码,显然该程序是一个无限运行的过程。

尽管文件头中有一些有趣的内容,CPU hot stack –这是问题的答案。

  • 到底是什么热堆?我在任何地方都找不到这个定义。

  • 如何准确检查堆栈,以确保文件数据不断写入并挂起。

我想我想说的是,从逻辑上讲,您是如何从CPU极限进程过渡到结论是堆栈出现问题了?

我的尝试

以下是文件本身strace的输出:

user@VirtualBox:~/Desktop/sre-prep/perf-labs/src$ clear
user@VirtualBox:~/Desktop/sre-prep/perf-labs/src$ strace -t ./lab001
14:57:14 execve("./lab001", ["./lab001"], 0x7ffdb0599758 /* 25 vars */) = 0
14:57:14 brk(NULL)                      = 0x559735f39000
14:57:14 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
14:57:14 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
14:57:14 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
14:57:14 fstat(3, {st_mode=S_IFREG|0644, st_size=84089, ...}) = 0
14:57:14 mmap(NULL, 84089, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe524ab2000
14:57:14 close(3)                       = 0
14:57:14 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
14:57:14 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
14:57:14 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
14:57:14 fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
14:57:14 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe524ab0000
14:57:14 mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe5244af000
14:57:14 mprotect(0x7fe524696000, 2097152, PROT_NONE) = 0
14:57:14 mmap(0x7fe524896000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7fe524896000
14:57:14 mmap(0x7fe52489c000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe52489c000
14:57:14 close(3)                       = 0
14:57:14 arch_prctl(ARCH_SET_FS, 0x7fe524ab14c0) = 0
14:57:14 mprotect(0x7fe524896000, 16384, PROT_READ) = 0
14:57:14 mprotect(0x55973545a000, 4096, PROT_READ) = 0
14:57:14 mprotect(0x7fe524ac7000, 4096, PROT_READ) = 0
14:57:14 munmap(0x7fe524ab2000, 84089)  = 0

我可以看到内存已映射,但是在此程序中甚至没有“传统”变量,因此我无法认为这首先是堆栈问题。

这是文件本身:

/*
 * lab001 - CPU hot stack.
 *
 * 21-May-2015  Brendan Gregg   Created this.
 */

void
func_c()
{
    for(;;){}
}

void
func_b()
{
    func_c();
}

void
func_a()
{
    func_b();
}

int
main(int argc, char *argv[])
{
    func_a();
    return (0);
}

在此先感谢您分享的见解!

0 个答案:

没有答案