1个不稳定版本
| 0.1.0 | 2023年9月30日 |
|---|
#223 在 性能分析
54KB
1.5K SLoC
lua-perf
lua-perf是一个基于eBPF实现的性能分析工具,目前仅支持Lua 5.4。
功能
- 提供对
C和Lua混合代码的性能分析,同时也支持纯C代码。 - 采用栈采样技术,并且对目标进程的性能影响非常小,可以在生产环境中使用。
- 通过使用
eh-frame在内核空间进行栈回溯,不要求目标进程使用-fno-omit-frame-pointer选项来保留栈帧指针。
执行要求
为了使用lua-perf,您需要满足以下要求:
- 安装的
Kernel版本需要在5.17以上。
生成火焰图
要生成火焰图,您需要使用lua-perf配合FlameGraph工具进行操作。以下是步骤:
-
首先,使用命令
sudo lua-perf -p <pid> -f <HZ>对目标进程进行栈采样,并在当前目录下生成perf.fold文件。其中<pid>是目标进程的进程ID,可以是Docker内的进程或者宿主机上的进程。<HZ>是栈的采样频率,默认为1000(即每秒采样1000次)。 -
然后,使用命令
./FlameGraph/flamegraph.pl perf.folded > perf.svg将perf.fold文件转换成火焰图。 -
最后,您就可以在当前目录下找到生成的火焰图
perf.svg。
这是一个示例火焰图:
日志
在BPF程序中,使用了bpf_printk来打印日志,当你怀疑性能采样结果可能有异常时,您可以通过以下命令来查看日志。
sudo mount -t tracefs nodev /sys/kernel/tracing
sudo cat /sys/kernel/debug/tracing/trace_pipe
已知问题
lua-perf目前存在以下已知问题:
- 尚不支持
CFA_expression,在某些极端情况下可能会导致调用栈回溯失败。 - 在分析Lua栈时,目前通过写入固定的寄存器
rbx来寻找L指针,这在大多数情况下对于GCC -O2是正确的。但是,根据GCC的优化级别不同,L的值可能存储在不同的寄存器中,这可能导致Lua栈回溯失败。 - 在分析
CFA指令时,暂时没有处理vdso,因此在vdso中的函数调用会导致栈回溯失败。 - 在合并进程的C栈和Lua栈时,采用了启发式的合并策略,极端情况下可能存在一些瑕疵(目前尚未发现)。
待完成事项
以下是lua-perf计划完成的事项:
- 支持
CFA_expression - 支持
vdso - 动态分析
L寄存器 - 优化C栈和Lua栈的合并策略
- 支持更多版本的Lua
依赖项
~50MB
~1M SLoC