我可以分析在Redis中运行的Lua脚本吗?

Dre*_*fer 8 lua profiling redis

我有一个使用分布式Redis后端的集群应用程序,动态生成的Lua脚本被分派到redis实例.Lua组件脚本可能变得相当复杂并且具有显着的运行时间,并且我希望能够对它们进行分析以找到热点.

SLOWLOG 对于告诉我脚本很慢,以及它们的速度有多慢很有用,但这不是我的问题.我知道它们有多慢,我想弄清楚它们哪些部分很慢.

redis EVAL文档很清楚redis不会将任何计时功能导出到lua,这使得它看起来可能是一个失败的原因.

那么,简短一个Redis的自定义分支,有没有办法告诉我的Lua脚本哪些部分比其他部分慢?

编辑 我接受了Doug的建议并使用了debug.sethook - 这是我在脚本顶部插入的钩子例程:

redis.call('del', 'line_sample_count') 
local function profile() 
  local line = debug.getinfo(2)['currentline'] 
  redis.call('zincrby', 'line_sample_count', 1, line) 
end 
debug.sethook(profile, '', 100)
Run Code Online (Sandbox Code Playgroud)

然后,看看我脚本中最热门的10行:

ZREVRANGE line_sample_count 0 9 WITHSCORES
Run Code Online (Sandbox Code Playgroud)

Dou*_*rie 2

如果您的脚本正在处理绑定(而不是 I/O 绑定),那么您可以使用debug.sethook带有计数钩子的函数:

\n\n
\n

计数钩子:在解释器执行每n个计数指令后调用。(此事件仅在 Lua 执行 Lua 函数时发生。)

\n
\n\n

您必须根据回调中收到的计数构建分析器。

\n\n

PepperfishProfiler将是一个很好的起点。它使用os.clock你没有的东西,但你可以使用钩子计数来进行非常粗略的近似。

\n\n

PiL 23.3 \xe2\x80\x93 配置文件中也涵盖了这一点

\n