分析一个达到 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章