Когда таблица delayed_jobs
начинает расти на вершине нескольких сотен, производительность рабочих начинает экспоненциально убывать.Ruby, DelayedJob становится медленным, когда слишком много ожидающих работы
ответ
Я несколько раз боролся с этой проблемой, поэтому я раскрываю свои выводы для будущих новичков в этом кошмаре.
Есть несколько вопросов, открываемые в проект DelayedJobs относительно к этому вопросу:
- https://github.com/collectiveidea/delayed_job/issues/581
- https://github.com/collectiveidea/delayed_job/issues/650
Проблема заключается в DelayedJob запроса используется в Эйвери рабочего прогона:
UPDATE `delayed_jobs` SET `locked_at` = '2014-04-17 22:32:20', `locked_by` = 'host:b38f770a-f3f3-4b2a-8c66-7c8eebdb7fea pid:2' WHERE ((run_at <= '2014-04-17 22:32:20' AND (locked_at IS NULL OR locked_at < '2014-04-17 18:32:20') OR locked_by = 'host:b38f770a-f3f3-4b2a-8c66-7c8eebdb7fea pid:2') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1
Это ca n занимает почти 1 секунду, в моем случае, менее 1000 рабочих мест .. и экспоненциально возрастает по мере того, как ожидается ожидание работы.
Единственное решение, которое я нашел это один выставляет в this blog, в двух словах: Поскольку проблема является отсутствие надлежащего индекса для первоначального запроса, решение разделить таблицу в партиях:
-- stop workers
select max(id) from delayed_jobs; -- -> 10010
create table delayed_jobs_backup like delayed_jobs;
insert into delayed_jobs_backup select * from delayed_jobs where id < 10010;
delete from delayed_jobs where id < 10010;
-- start workers
-- while jobs in delayed_jobs_backup do
-- wait until the batch have been processed
insert into delayed_jobs select * from delayed_jobs_backup limit 1000;
delete from delayed_jobs_backup limit 1000;
-- end
Задержка работы не оптимизирована для очень большого количества рабочих мест. Чем дольше срок решение перейти на что-то вроде sidekiq (https://github.com/mperham/sidekiq), но за короткий срок вы можете использовать стратегию ниже, чтобы очистить очередь delayed_job:
- 1. Sql-запрос становится слишком медленным
- 2. kubenetes стал очень медленным, когда он запускает слишком много контейнеров
- 3. Сервер 500: Слишком много ожидающих безопасных разговоров
- 4. SWTBot становится очень медленным
- 5. Django становится очень медленным, когда DEBUG = False
- 6. Makefile делает «слишком много работы»
- 7. Приложение для iPhone становится настолько медленным, когда оно становится активным
- 8. Browserify + gulp становится медленным
- 9. становится слишком много столкновений с hash_combine
- 10. Приложение становится слишком медленным, рисуя два растровых изображения на холсте!
- 11. Симулятор становится очень медленным
- 12. Запрос MySQL становится медленным
- 13. BerkeleyDB становится толстым и медленным
- 14. Eclipse становится слишком медленным - поддержка рабочего пространства помогла
- 15. У Buildbot слишком много ожидающих заданий и вообще перестало строить
- 16. Когда слишком много для cakephp?
- 17. Программа не работает, слишком много работы?
- 18. Android - слишком много работы в главной теме
- 19. Приложение становится слишком медленным, когда я использую sqlite в своем приложении
- 20. Когда защита защищает слишком много
- 21. ошибка: слишком много заданы параметры для работы
- 22. Android Основной поток слишком много работы
- 23. Слишком много работы на главной теме?
- 24. Слишком много работы над основной нитью Предупреждение
- 25. Xcode становится очень медленным. Как сделать это быстро?
- 26. метод Haskell является слишком медленным
- 27. Создание машинописных заметок становится медленным - WebStorm
- 28. Scaling Puppet - когда слишком много для WEBrick?
- 29. Сервер Xamarin Mac становится медленным, когда основное окно неактивно
- 30. QTableView становится очень медленным, когда выбрано несколько строк
бы добавление надлежащего индекса к основной базе данных не разрешите это без необходимости обработки выше? – mcfinnigan
@mcfinnigan похоже, что это не так просто, в упомянутом сообщении в блоге и в вопросах github есть много попыток решить это элегантным способом, и никто из них не работал. – fguillen
В качестве теста я добавил 500 000 заданий в свою БД, и я не вижу никаких проблем с производительностью, использующих postgres, рабочие задания заканчиваются через .00x секунд. Есть ли какое-то конкретное условие вашей работы, которое усугубляет проблему? – Tallboy