确保已安装 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