安装依赖

确保已安装 perf 和 FlameGraph 工具。

FlameGraph 通过以下命令下载

git clone https://github.com/brendangregg/FlameGraph.git

原理

相关格式

调用栈文本格式

使用 sudo perf script > out.perf 生成的格式如下所示


perf-exec  376271 140211.225788:          1 cycles:P:
        ffffffff8b268a13 perf_lock_task_context+0x3 ([kernel.kallsyms])
        ffffffff8b271ee9 perf_event_exec+0x1a9 ([kernel.kallsyms])
        ffffffff8b330c60 begin_new_exec+0x5c0 ([kernel.kallsyms])
        ffffffff8b39b2df load_elf_binary+0x2bf ([kernel.kallsyms])
        ffffffff8b32fa7e bprm_execve+0x23e ([kernel.kallsyms])
        ffffffff8b3302ed do_execveat_common.isra.0+0x1ad ([kernel.kallsyms])
        ffffffff8b3311c3 __x64_sys_execve+0x33 ([kernel.kallsyms])
        ffffffff8bf22e55 do_syscall_64+0x35 ([kernel.kallsyms])
        ffffffff8c000124 entry_SYSCALL_64_after_hwframe+0x6c ([kernel.kallsyms])
            7f76332aef3b [unknown] ([unknown])

perf-exec  376271 140211.225798:          1 cycles:P:
        ffffffff8b268a13 perf_lock_task_context+0x3 ([kernel.kallsyms])
        ffffffff8b271ee9 perf_event_exec+0x1a9 ([kernel.kallsyms])
        ffffffff8b330c60 begin_new_exec+0x5c0 ([kernel.kallsyms])
        ffffffff8b39b2df load_elf_binary+0x2bf ([kernel.kallsyms])
        ffffffff8b32fa7e bprm_execve+0x23e ([kernel.kallsyms])
        ffffffff8b3302ed do_execveat_common.isra.0+0x1ad ([kernel.kallsyms])
        ffffffff8b3311c3 __x64_sys_execve+0x33 ([kernel.kallsyms])
        ffffffff8bf22e55 do_syscall_64+0x35 ([kernel.kallsyms])
        ffffffff8c000124 entry_SYSCALL_64_after_hwframe+0x6c ([kernel.kallsyms])
            7f76332aef3b [unknown] ([unknown])

文件包含多个块

每个块第一行表示采样执行的函数名,事件,计数,事件

第二行到块末尾表示的是调用栈,里面包含函数的名字,地址,是否内核函数

调用栈折叠文本格式

将采样数据中的调用栈折叠为一行一行的格式,每一行表示一个调用栈及其采样次数。使用 stackcollapse-perf.pl 脚本完成这一步骤:

./FlameGraph/stackcollapse-perf.pl out.perf > out.folded

折叠后的文件格式如下:

perf-exec;[unknown];entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_execve;do_execveat_common.isra.0;bprm_execve;load_elf_binary;begin_new_exec;perf_event_exec;perf_lock_task_context 339
sleep;[unknown];entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_execve;do_execveat_common.isra.0;bprm_execve;load_elf_binary;setup_arg_pages;shift_arg_pages;__vma_adjust 46635