我们正在使用EventMachine来监听和处理入站I / O事件,我们遇到了一个奇怪的问题,在某些时候,我们的事件循环会在一段时间后完全楔入它停止响应的地方。我们是EventMachine的新手,在事件循环中有一些同步代码并不是很好,但我不希望它在轻负载下完全停止。我们无法一致地重现这个问题,这使得它很难确定下来。
我希望更好地监控循环内的延迟。 This Stackoverflow answer建议连接我已经完成的定期计时器,这似乎到目前为止效果很好。
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 Custom Metric,但我似乎无法获得这些事件。我在this Stackoverflow thread中读到可以强制启动New Relic,但也不支持它。我能做什么?它还提出了一个更大的问题,即监控EM流程的最佳实践是什么,并了解它们何时变得供应不足?