我们正在使用 EventMachine 来侦听和处理入站 I/O 事件,我们遇到了一个奇怪的问题,即在某个时间点,我们的事件循环在一段时间后完全卡在它停止响应的地方。我们是 EventMachine 的新手,并且在事件循环中有一些同步代码,这不是很好,但我不希望它在轻负载下完全停止。我们无法始终如一地重现该问题,这使得很难确定它。
我想更好地监控循环内的延迟。这个 Stackoverflow 答案建议连接一个我已经完成的定期计时器,到目前为止这似乎运作良好。
def self.monitor_reactor_backup
@last = Time.now
EM.add_periodic_timer(0.1) do
latency_ms = (Time.now - @last - 0.1) * 1000
if latency_ms > 2
# ::NewRelic::Agent.record_metric('Custom/EM/event_loop_latency', latency_ms)
msg = "REACTOR BACK-UP >2ms MELTDOWN IMMINENT: #{latency_ms.round} ms"
Rails.logger.error msg
puts msg if CONSOLE_MODE
end
@last = Time.now
end
end
我已经尝试为此添加一个NewRelic 自定义指标,但我似乎无法获得这些事件。我在这个 Stackoverflow 线程中读到,可以强制启动 New Relic,但也不支持它。我能做些什么?它还提出了一个更大的问题,即围绕监控 EM 流程并了解它们何时供应不足的最佳实践是什么?