分析一个达到 100% CPU 且永不结束的 ruby​​ 应用程序

Posted

技术标签:

【中文标题】分析一个达到 100% CPU 且永不结束的 ruby​​ 应用程序【英文标题】:Profiling a ruby app that hits 100% CPU and never ends 【发布时间】:2011-02-14 22:41:35 【问题描述】:

我正在使用邮件gem 来解析一组电子邮件。不幸的是,其中一封电子邮件导致解析达到 100% CPU 并且永远不会返回。

我一直在使用 ruby​​-prof 和基准测试工具来查看邮件 gem,但我的问题是如何在脚本不返回的情况下分析并找出问题所在。

很遗憾,我不知道如何重现此错误,并且我收到的消息是机密信息,因此我无法分享。据我所知,它并没有什么特别之处,当 30mb 的电子邮件可以正常解析时,它只有 4mb 大。

谢谢!

【问题讨论】:

无限(或非常长时间运行)循环是最容易找到的,假设您有源代码并在调试环境中运行。您只需暂停它(通过 Ctrl-C 或其他方式)。你知道问题出在堆栈的某个地方。然后开始单步执行,直到您发现问题为止。 【参考方案1】:

您必须使用任何调试器,并逐步调试,看看关键代码行在哪里。例如对于 php 应用程序,我使用 Zend Studio 进行调试。 阿尔班

【讨论】:

我对 rdebug 不是很有经验,但是使用 gdb 你可以在应用程序执行时按ctrl+c,它会打开调试控制台。 我不知道为什么我没想到这样做。我经常使用 ruby​​-debug,我只是假设由于调用次数和一般问题,我需要分析以查看问题出在哪里,但单步执行可能真的有效! @Steve:这只是this technique 的一个极端情况。 谢谢大家。你是对的,一旦我知道我在做什么,这绝对是最容易找到的东西。使用 ctrl-c 退出 ruby​​ 会显示堆栈跟踪。这样做几次突出了错误所在。那么这只是围绕该区域进行调试的一个案例。 @Steve:只是好奇。问题是在堆栈的底部还是在中间的某个地方?

以上是关于分析一个达到 100% CPU 且永不结束的 ruby​​ 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

CPU持续100%分析并解决

NodeJS CPU 一次达到 100% 一个 CPU

CPU持续100%分析并解决

CPU持续100%分析并解决

为啥 C# 中的多线程不能达到 100% CPU?

使用 mongodb 的 CPU 几乎达到 100%