Как я могу контролировать процесс EventMachine?
Мы используем EventMachine для прослушивания и обработки входящих событий ввода-вывода, и мы сталкиваемся со странной проблемой, когда в какой-то момент наш цикл событий полностью заклинивает, где он перестает отвечать через некоторое время. Мы новички в EventMachine и в цикле событий есть биты синхронного кода, что не очень хорошо, но я бы не ожидал, что он полностью остановится при небольшой нагрузке. Мы не смогли последовательно воспроизвести проблему, из-за чего действительно трудно ее определить.
Я хотел бы лучше контролировать задержку внутри цикла. Этот ответ Stackru предлагает подключить периодический таймер, что я и сделал, и до сих пор это работает хорошо.
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 к этому, но я не могу получить события. В этой ветке Stackru я читал, что New Relic можно принудительно запустить, но он также не поддерживается. Что я могу сделать? Это также поднимает более широкий вопрос о том, каковы лучшие практики мониторинга процессов EM и знания, когда они становятся недостаточно обеспеченными?