26

或者更确切地说,为什么没有更好的工具来分析 ruby​​ 中的内存,特别是 rails 应用程序?

最近,我们的 rails 应用程序(托管在 heroku 上)开始在 worker dynos 中看到很多 R14 错误。这意味着我们的内存不足。将测功机提高到 2 倍(512mb -> 1GB)只能暂时缓解问题,让我相信某处存在内存泄漏。当然,我的下一步是找到一个好的分析 gem,它可以帮助我发现泄漏的来源。

也许我只是对可用的工具一无所知,或者我只是不知道如何使用我拥有的工具。我的愿望是我可以安装一个 gem,然后运行关于内存使用统计的报告。命中端点以获取报告并不是真正可行的,因为我的内存问题与运行延迟作业的工人测功机隔离。

我看过memprof,但它只有 1.8。

我看过ruby ​​-prof (真棒),但内存分析需要一个修补的 ruby​​ 解释器。

我看过GC::Profiler,但我不明白如何用它找到内存泄漏。

那么,很难在 ruby​​ 中找到内存泄漏吗?还是我以某种方式错过了重点?

4

4 回答 4

4

根据您的泄漏“类型”,您可以针对 ruby​​ 运行 valgrind。不过可能需要重新编译。一般来说,这很困难,因为 ruby​​ 默认情况下会在不触发任何事件的情况下进行方法分配,因此很难跟踪。另请参阅perftools.rb 项目,它在一定程度上解决了这个限制。

于 2013-04-30T20:43:17.850 回答
3

最近,我在Skylight上取得了一些成功,可以分析 Web 和后台工作人员方法,然后寻找优化的机会。当您发布此问题时,它可能不存在。缺点是它只能真正帮助您在暂存或生产环境中进行调试,而不是在开发环境中进行调试,因此开发循环可能非常慢。

如果您使用 Sidekiq,请确保同时安装skylight-rubysidekiq-skylight以在您的 Web 服务器和后台工作人员上进行分析。

祝你好运!

于 2016-11-11T16:41:34.157 回答
0

如果您的应用程序在使用 dtrace 或 SystemTap 等类似技术的操作系统上运行,那么有一个很好的方法。在我的情况下,我们使用具有后者的 RHEL/CentOS:

https://lukas.zapletalovi.com/2016/08/probing-ruby-20-apps-with-systemtap-in-rhel7.html

您可以轻松连接到生产应用程序并“注入”分析代码片刻并跟踪调用、内存、CPU 时间或 I/O,然后随时“断开连接”。它非常有效,因此您可能不会注意到任何剧烈的减速(除非您搞砸了脚本)。

于 2020-06-03T10:43:55.690 回答
-4

我不同意 Ruby 中的内存分析很难。JVM 有一些世界上最好的内存分析工具,你可以在 JVM 上运行你的 Ruby 程序。不要重新发明轮子。

于 2013-05-01T04:43:00.297 回答