Как я могу контролировать процесс 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 и знания, когда они становятся недостаточно обеспеченными?

0 ответов

Другие вопросы по тегам