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

时间:2013-05-04 03:38:14

标签: lua redis profiling

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

SLOWLOG is useful告诉我我的脚本很慢,而且它们的速度有多慢,但这不是我的问题。我知道它们有多慢,我想弄清楚它们哪些部分很慢。

The redis EVAL docs很清楚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)

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

ZREVRANGE line_sample_count 0 9 WITHSCORES

2 个答案:

答案 0 :(得分:2)

如果您的脚本正在处理绑定(不受I / O限制),那么您可以将debug.sethook函数与count钩子一起使用:

  

count hook :在解释器执行每个之后调用   计数说明。 (此事件仅在Lua执行时发生   Lua功能。)

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

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

PiL 23.3 – Profiles

也涵盖了这一点

答案 1 :(得分:0)

在标准的Lua C中,你不能。它不是内置函数 - 它只返回秒。因此,有两个选项可供选择:您可以编写自己的Lua扩展DLL以返回以毫秒为单位的时间,或者:

您可以使用毫秒分辨率时间执行基本基准测试。您可以使用LuaSocket访问当前的毫秒时间。虽然这会为您的项目增加依赖性,但这是进行简单基准测试的有效方法。

require "socket"
t = socket.gettime();