我有一个使用分布式 Redis 后端的集群应用程序,动态生成的 Lua 脚本被分派(dispatch)到 redis 实例。 Lua 组件脚本可能会变得相当复杂并且有很长的运行时间,我希望能够分析它们以找到热点。
慢日志is useful感谢您告诉我我的脚本很慢,而且到底有多慢,但这不是我的问题。我知道它们有多慢,我想弄清楚它们的哪些部分很慢。
The redis EVAL docs很明显,redis 不会将任何计时功能导出到 lua,这使得这看起来可能是一个失败的原因。
那么,Redis 的自定义分支,有什么方法可以判断我的 Lua 脚本的哪些部分比其他部分慢?
编辑 我采纳了 Doug 的建议并使用了 debug.sethook - 这是我在脚本顶部插入的 Hook 例程:
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)
然后,查看我的脚本中 HitTest 门的 10 行:
ZREVRANGE line_sample_count 0 9 WITHSCORES
最佳答案
如果您的脚本是处理绑定(bind)(不是 I/O 绑定(bind)),那么您可以使用 debug.sethook
带有计数钩子(Hook)的函数:
The count hook: is called after the interpreter executes every count instructions. (This event only happens while Lua is executing a Lua function.)
您必须根据您在回调中收到的计数来构建分析器。
PepperfishProfiler将是一个很好的起点。它使用您没有的 os.clock
,但您可以使用 Hook 计数进行非常粗略的近似。
这也包含在 PiL 23.3 – Profiles 中
关于lua - 我可以分析在 Redis 中运行的 Lua 脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16370333/