我该如何调试不断攀升的 Ruby 进程?

我该如何调试不断攀升的 Ruby 进程?

几天前,我的所有 4 个应用服务器都开始出现问题。这是在我部署了一些代码之后发生的,但我所做的只是更新存储一些 IP 地址的本地数据库文件,因此我没有进行任何实际的代码更改。似乎就在那个时候,我的 ruby​​ 进程开始失控。它们会好一段时间,然后突然间它们在一个 CPU 上迅速攀升到 100%。由于我使用的是 Passenger,最终另一个线程也会做同样的事情,并耗尽另一个 CPU,依此类推,直到 Web 服务器无法再处理流量并停止响应。

我进行了大量调查(我并不擅长调查),但至少我发现,当对进程运行 strace 时,它​​们开始时看起来很正常,然后当它们像上面描述的那样变得疯狂时,它只是一连串的调用clock_gettime(CLOCK_REALTIME, {1518938625, 9566131}) = 0。正如我所说,正常进程不会不断地吐出东西,只有当网络请求进入时才会吐出东西,但随后某些东西会触发它,然后它就会变得疯狂,直到我终止进程,或重新启动 Passenger,或重新启动服务器。然后在一两个小时内,它又会出现问题。

我已经花了几天时间照看它,不停地重启东西以使其继续运行,但我迫切需要一些想法。我注意到一些非常古老的帖子,比如 2013 年的帖子,谈到这个 clock_gettime 的 100% CPU 问题,我尝试了与我看到的几篇帖子相关的两个建议。一个是设置 TZ 变量,另一个是修复某种闰秒错误。我不明白这两个建议修复背后的原因,但遗憾的是它们没有起作用。

我正在运行以下堆栈:ruby 2.2.0 Passenger 独立版:Gem 版本:4.0.58(并尝试在一台服务器上升级到 5.2.0,但行为没有变化)MySQL CentOS 6.9

相关内容