我有一个使用分布式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
答案 0 :(得分:2)
如果您的脚本正在处理绑定(不受I / O限制),那么您可以将debug.sethook
函数与count钩子一起使用:
count hook :在解释器执行每个之后调用 计数说明。 (此事件仅在Lua执行时发生 Lua功能。)
您必须根据回调中收到的计数构建一个分析器。
PepperfishProfiler将是一个很好的起点。它使用了你没有的os.clock
,但你可以使用钩子计数进行非常粗略的近似。
答案 1 :(得分:0)
在标准的Lua C中,你不能。它不是内置函数 - 它只返回秒。因此,有两个选项可供选择:您可以编写自己的Lua扩展DLL以返回以毫秒为单位的时间,或者:
您可以使用毫秒分辨率时间执行基本基准测试。您可以使用LuaSocket访问当前的毫秒时间。虽然这会为您的项目增加依赖性,但这是进行简单基准测试的有效方法。
require "socket"
t = socket.gettime();