我有一个使用分布式 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)
然后,查看我的脚本中最热门的 10 行:
ZREVRANGE line_sample_count 0 9 WITHSCORES