lua 程序性能分析工具 Plua 推荐
文章目录
- plua 是什么
- 可以测量哪些指标
- 支持多协程
- 使用教程
- 结语
- 参考
plua 是什么
p 是指 profiler,lua 就是 lua 语言。plua 是一个用于测量 lua 程序性能,并且提供将测量数据转化为火焰图的开源库。
可以测量哪些指标
目前 plua 可以测量函数粒度的 cpu 消耗和函数粒度的内存分布情况。参考下图:
图中表示一个 lua 程序一个 lua 虚拟机(多协程)执行过程中的完整堆栈情况,每个横条表示堆栈中的一个函数,横条的长度跟该函数耗时成正比。
这里是用采样次数来作为耗时指标看待。
可以看到最下面的入口函数的采样率是100%,就是每次采样(10ms一次),该函数都在调用堆栈中。
支持多协程
官方库是不支持多协程采样的,但是稍微复杂点的 lua 程序都会用到协程,且用的很频繁。所以我稍微修改了下 plua 和 lua 源码支持多协程采样。<地址>
lua 源码修改后,还是打包到 dep/lua-5.3.6.tar.gz 中。一般各个项目会有自己维护的 lua 版本,所以可以解压这个包后,对比 lstate.h 和 lvm.c 两个文件查看具体改动,就几行代码,可以移植到自己项目的 lua 源码中。
使用教程
- 环境准备
go version go1.24.2 linux/amd64
- 因为我的 go 版本比较新,所以还略微改动了编译脚本和火焰图生成工具的代码。
- 下载 plua 库
git clone https://github.com/tobybo/pLua.git
git switch -c develop origin/develop // 切到 develop 分支
- 安装 go 依赖
cd tools // 这是火焰图生成工具的目录
go mod init tools
go mod tidy
- 编译 plua 库和火焰图生成工具
cd plua
./build.sh
- 编译成功后,plua 库在 bin/libplua.so
- 编译适配的 lua
cd dep/lua-5.3.6
make linux
- 执行测试脚本
cd test
../dep/lua-5.3.6/src/lua test_cpu.lua
- 执行过后会生成一个 test/call.pro 采样数据文件
- 生成火焰图
cd tools
./show.sh ../test
- 执行过后会生成一个 call.svg 文件,通过网页浏览器打开该文件即可查看,建议另外用脚本直接上传到一个文件服务器上,通过网页随时查看,也方便共享
结语
- 官方版本编译脚本是编译成动态库,可以自己调整编译成静态库打包到自己程序中。
- 还可以考虑支持多线程,多虚拟机,如果业务有需要的话。
- 还可以考虑支持 jit。因为代码不变的情况下,测量结果是相对一致的,所以用 lua 版本测量也能找到性能热点。
参考
- https://github.com/esrrhs/pLua