lua 程序性能分析工具 Plua 推荐

发布于:2025-06-28 ⋅ 阅读:(14) ⋅ 点赞:(0)

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 版本测量也能找到性能热点。

参考