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

标签 lua redis profiling

我有一个使用分布式 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/

相关文章:

lua - 套接字库,连接到站点并打印其内容

java - LuaJava编译错误 "Unresolved external symbol"

REDIS - 多组交集

redis - ServiceStack.Redis.RedisResponseException 使用 Redis 集群和 Twemproxy

python - 逐行分析 Django View

macos - 使用lua filename.lua时出错

io - 如何让lua按顺序运行

go - 是否有一个 golang redis 客户端可以自动检测 pubsub 的新分片?

c++ - 哪个是 KProf 的最佳替代品?

javascript - 扩展 native 函数以在函数调用时运行代码