9

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

2 回答 2

2

如果您的脚本正在处理绑定(不是 I/O 绑定),那么您可以使用debug.sethook带有计数挂钩的函数:

count 钩子:在解释器执行每个 count 指令后调用。(此事件仅在 Lua 执行 Lua 函数时发生。)

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

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

这也包含在PiL 23.3 – 配置文件中

于 2013-05-04T04:48:03.017 回答
0

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

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

require "socket"
t = socket.gettime();
于 2013-05-04T03:42:47.453 回答