Home

Awesome

pLua

<img src="https://img.shields.io/github/license/esrrhs/pLua"> <img src="https://img.shields.io/github/languages/top/esrrhs/pLua"> <img src="https://img.shields.io/github/actions/workflow/status/esrrhs/pLua/ccpp.yml?branch=master">

Lua 性能分析工具

简介

类似于gperftools,可分析Lua程序的热点及内存分配情况

特性

编译

# ./build.sh
# yum install perl-open.noarch

使用

获取CPU采样数据

-- 引入libplua.so
local p = require "libplua"
-- 开启采样
-- 参数1:采样时间(秒),0表示一直采样
-- 参数2:采样结果文件
p.start(0, "call.pro")

do_some_thing()

-- 结束采样,输出结果文件
p.stop()

a) 首先获取进程中的Lua_State指针,比如进程的xxx.so调用了lua_settop(L)函数,那么就取第一个参数
# ./hookso arg $PID xxx.so lua_settop 1 
123456

b) 加载libplua.so
# ./hookso dlopen $PID ./libplua.so

c) 执行libplua.so的lrealstart手动开启,等价于lrealstart(L, 0, "./call.pro")
# ./hookso call $PID libplua.so lrealstart i=123456 i=0 s="./call.pro"

c) 执行libclua.so的lrealstop手动关闭,等价于lrealstop(L)
# ./hookso call $PID libplua.so lrealstop i=123456

获取内存采样数据

-- 引入libplua.so
local p = require "libplua"
-- 开启采样
-- 参数1:采样时间(秒),0表示一直采样
-- 参数2:采样结果文件名,会生成2个采样文件,分别代表内存分配大小、内存占用大小
p.start_mem(0, "mem.pro")

do_some_thing()

-- 结束采样,输出结果文件
p.stop_mem()

a) 首先获取进程中的Lua_State指针,比如进程的xxx.so调用了lua_settop(L)函数,那么就取第一个参数
# ./hookso arg $PID xxx.so lua_settop 1 
123456

b) 加载libplua.so
# ./hookso dlopen $PID ./libplua.so

c) 执行libplua.so的lrealstartmem手动开启,等价于lrealstartmem(L, 0, "./call.pro")
# ./hookso call $PID libplua.so lrealstartmem i=123456 i=0 s="./call.pro"

c) 执行libclua.so的lrealstopmem手动关闭,等价于lrealstopmem(L)
# ./hookso call $PID libplua.so lrealstopmem i=123456

示例

运行test目录下的lua

# lua test_cpu.lua
# lua test_mem.lua

生成可视化结果

使用tools目录下的show.sh脚本生成gperftools风格png及火焰图

# cd tools
# ./show.sh ../test

查看test_cpu.lua的热点

image

查看test_mem.lua的内存采样

其他

lua全家桶