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 Custom Metricを追加して実験しましたが、イベントを取得できないようです。この Stackoverflow スレッドで、New Relic を強制的に起動できるが、サポートされていないことを読みました。私に何ができる?また、EM プロセスを監視し、プロビジョニング不足になる時期を知るためのベスト プラクティスとは何かという、より大きな問題も提起されます。