Оказалось, что наша проблема была вызвана наличием собственных пользовательских обработчиков Resque.before_fork
и Resque.after_fork
.
Гем NewRelic RPM автоматически установит хуки с Resque.before_fork
и Resque.after_fork
, чтобы установить канал связи для рабочих. Как ограничение Resque, он запускает только последний назначенный блок/Proc для перехватчиков before_fork и after_fork. Итак, если у вас есть свои собственные хуки before_fork/after_fork, вы *должны* настроить канал связи агента вручную, например в файле config/initializers/custom_resque.rb:
Resque.before_fork do |job|
NewRelic::Agent.register_report_channel(job.object_id)
# extra custom stuff here
end
Resque.after_fork do |job|
NewRelic::Agent.after_fork(:report_to_channel => job.object_id)
# extra custom stuff here
end
Этот код взят непосредственно из файла гема RPM gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb
Обновление об ошибке RPM от 27 декабря 2012 г. После развертывания описанной выше методики мы обнаружили, что гем RPM пропускает дескрипторы файлов при использовании в разветвленном режиме (например, Resque). Мы наблюдали сообщения об ошибках вида ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''
. После долгих поисков мы обнаружили, что это вызвано тем, что ActiveRecord пытается открыть соединение с базой данных и не может, потому что количество файловых дескрипторов исчерпано. New Relic подтвердила наличие ошибки в агенте при выборке плана объяснения. Это происходит, когда выполняется много заданий Resque, которые подключаются к БД.
Обновление ошибки от 28 января 2013 г. После долгих размышлений мы обнаружили, что эта ошибка была вызвана неподдерживаемым взаимодействием с resque-lonely_job, который использует хук Resque before_perform
, который может остановить задание Resque с исключением Resque::Job::DontPerform
. Клиент RPM не выполняет очистку должным образом в этой ситуации и приводит к утечке файловых дескрипторов. New Relic была проинформирована и работает над исправлением.
Обновление от 10 апреля 2013 г. исправлено. Мы используем 3.6.0.78, и он обрабатывает этот случай. Больше никаких утечек файловых дескрипторов! Спасибо Новой Реликвии.
person
Wolfram Arnold
schedule
18.10.2012