再次实现了一个Lua性能分析器
💡
原文中文,约4900字,阅读约需12分钟。
📝
内容提要
该文介绍了作者通过研究eBPF技术,实现了一个基于栈采样技术的Lua性能分析器,并解决了之前存在的问题。
🎯
关键要点
- 作者通过研究eBPF技术,开发了一个基于栈采样的Lua性能分析器。
- Go语言的性能分析工具强大,能够在生产环境中采样数据,但Lua缺乏类似工具。
- 现有Lua性能分析器对宿主程序性能影响大,无法在线上环境使用。
- 现有分析器无法统计C模块内部的C函数开销,导致性能分析不连贯。
- 使用C性能分析器时,失去上下文信息,无法确定Lua代码与C函数的关系。
- eBPF技术的研究使作者能够解决Lua性能分析器的缺点。
- 新的Lua性能分析器是独立程序,具有无侵入性,能够在目标程序死循环时正常运行。
- 实现过程中遇到现代编译器优化导致栈帧指针被抹去的问题。
- 选择手动进行栈回溯以避免对目标程序的侵入。
- 使用eh_frame section提供的CFI指令进行栈回溯,满足性能分析需求。
- 通过预处理eh_frame数据,加快bpf程序执行速度。
- Lua调用栈的回溯需要保留当前文件信息,避免垃圾回收导致信息丢失。
- 使用字符串映射表简化Lua调用栈的存储,避免空间浪费。
- 手动实现栈回溯功能,利用用户空间大内存支持复杂操作。
- Lua 5.4版本开始支持yield功能,导致Lua调用栈与C调用栈不一致的问题。
- bpf校验器确保bpf程序不损坏内核数据,但可能导致误报和编译器优化问题。
➡️