调试神秘的 Ruby 进程崩溃
Debugging a mysterious Ruby process crash
我有一个 Ruby 进程 运行 在 m3.medium EC2 实例上持续进行,将队列中的内容渲染到 S3 中。它偶尔会死掉(通常一天死几次),没有明显的原因,也没有任何解释。
该应用程序由 elasticbeanstalk 部署,并从一个运行 ruby --verbose app.rb
的 ebextensions 脚本开始,并将错误通过管道传输到文件(最初没有 --verbose,但我们添加了它,希望更多详情)。退出后,两个文件中都没有任何错误提示。应用程序的顶层如下所示:
loop do
begin
do_processing
rescue Exception => e
puts "Error! #{e}"
end
end
所以它不太可能自行退出或从异常中退出(我认为)。
服务器始终保持 运行 并且没有 运行 内存不足。有时它会在峰值负载(高达 CPU 的 100%)时崩溃,但并非总是如此。
是否有 Ruby 工具可用于获取有关进程退出原因的更多信息?我是否有可能达到其他 EC2 或 Ruby 限制而关闭进程?我该怎么做才能获得有关这里发生的事情的更多信息?
我们现在已经解决了这个问题:问题最终是一个真正的堆栈溢出,在我们的代码库深处。我们有一个装饰器泄漏,我们偶尔将我们的记录器包装在另一个日志装饰器中,因此日志记录变得越来越慢,最终变得太深并导致应用程序崩溃。解决了很多问题。
堆栈溢出无法以任何正常方式捕获,并且无法将任何输出推送到日志,因为没有剩余堆栈,这听起来很合理,导致无声 Ruby 崩溃。这清楚地解释了这一点,并修复了这已经为我们完全解决了这个问题。
对于未来尝试调试此类事情的人,如果这不是您的答案:请使用 post-mortem 调试 (http://bashdb.sourceforge.net/ruby-debug.html#Post_002dMortem-Debugging) 查看 运行 您的应用,以便它打开调试器崩溃,看看它在哪里结束。我们发现我们的应用程序在日志记录中有很多层,问题很快就变得很明显。
我有一个 Ruby 进程 运行 在 m3.medium EC2 实例上持续进行,将队列中的内容渲染到 S3 中。它偶尔会死掉(通常一天死几次),没有明显的原因,也没有任何解释。
该应用程序由 elasticbeanstalk 部署,并从一个运行 ruby --verbose app.rb
的 ebextensions 脚本开始,并将错误通过管道传输到文件(最初没有 --verbose,但我们添加了它,希望更多详情)。退出后,两个文件中都没有任何错误提示。应用程序的顶层如下所示:
loop do
begin
do_processing
rescue Exception => e
puts "Error! #{e}"
end
end
所以它不太可能自行退出或从异常中退出(我认为)。
服务器始终保持 运行 并且没有 运行 内存不足。有时它会在峰值负载(高达 CPU 的 100%)时崩溃,但并非总是如此。
是否有 Ruby 工具可用于获取有关进程退出原因的更多信息?我是否有可能达到其他 EC2 或 Ruby 限制而关闭进程?我该怎么做才能获得有关这里发生的事情的更多信息?
我们现在已经解决了这个问题:问题最终是一个真正的堆栈溢出,在我们的代码库深处。我们有一个装饰器泄漏,我们偶尔将我们的记录器包装在另一个日志装饰器中,因此日志记录变得越来越慢,最终变得太深并导致应用程序崩溃。解决了很多问题。
堆栈溢出无法以任何正常方式捕获,并且无法将任何输出推送到日志,因为没有剩余堆栈,这听起来很合理,导致无声 Ruby 崩溃。这清楚地解释了这一点,并修复了这已经为我们完全解决了这个问题。
对于未来尝试调试此类事情的人,如果这不是您的答案:请使用 post-mortem 调试 (http://bashdb.sourceforge.net/ruby-debug.html#Post_002dMortem-Debugging) 查看 运行 您的应用,以便它打开调试器崩溃,看看它在哪里结束。我们发现我们的应用程序在日志记录中有很多层,问题很快就变得很明显。