テーブルdelayed_jobs
が数百の上に成長し始めると、作業者のパフォーマンスが指数関数的に低下し始めます。Ruby、DelayedJobが遅すぎると処理が遅くなる
0
A
答えて
0
私はこの問題に何度も苦労していますので、私はこの悪夢に将来の新人のための私の発見を公開します。問題は、クエリDelayedJobである
- https://github.com/collectiveidea/delayed_job/issues/581
- https://github.com/collectiveidea/delayed_job/issues/650
エイブリィワーカーの実行に使用しています:
は、この問題に係るDelayedJobsプロジェクトに開かれたいくつかの問題があります
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私の場合、1000ジョブ未満で約1秒かかる。また、より多くのジョブが保留になると指数関数的に増加する。
私が見つけた唯一の解決策は、1は一言で言えば、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
0
遅延ジョブは非常に多数のジョブに対して最適化されていません。長期的な解決策はsidekiq(https://github.com/mperham/sidekiq)のようなものに移動することですが、短期のために、あなたのdelayed_jobキュークリアするには、以下の戦略を使用することができます。
関連する問題
- 1. ANDROID-dx処理が遅すぎる
- 2. ProgressDialogが遅すぎると表示が遅すぎる
- 3. rubyで再帰が遅すぎる
- 4. VBaのレコードセットによるループ処理が遅すぎる
- 5. ハイブクエリが遅すぎると
- 6. 処理遅れが
- 7. telnetセッションのキャプチャが遅すぎる - pexpectとtelnetlibが遅すぎる
- 8. ImageGrab.grab()メソッドが遅すぎる
- 9. WordPress:サイトが遅すぎる
- 10. PHP:scandir()が遅すぎる
- 11. Gitクローンが遅すぎる
- 12. SparkStreamingアプリケーションが遅すぎる
- 13. CopyOnWriteArraySetが遅すぎる
- 14. プロミスが遅すぎる
- 15. Sqlクエリが遅すぎる
- 16. サイトローディングが遅すぎる
- 17. Xcodeが遅すぎる
- 18. Pythonカウンターが遅すぎる
- 19. ResultSetパーサーが遅すぎる
- 20. スティッキースティックが遅すぎる
- 21. アイランドペリメーションアルゴリズムが遅すぎる
- 22. コードが遅すぎる
- 23. ルーピングストアドプロシージャが遅すぎる
- 24. java-system.nanoTime()が遅すぎる
- 25. アマゾンAWSSDKforPHPが遅すぎる
- 26. CellEditEndedが遅すぎる
- 27. regexが遅すぎる
- 28. URLSession didReceiveChallengeが遅すぎる
- 29. Googleスクリプトが遅すぎる
- 30. パラビューが遅すぎる
は、基礎となるデータベースに適切なインデックスを追加することではないでしょうが上記の処理を行うことなくこれを解決しますか? – mcfinnigan
@mcfinniganはそれほど簡単ではないようです。言及されたブログ記事やgithubの問題では、これを優雅な方法で解決しようとする試みがたくさんあります。 – fguillen
テストとして私は私のDBに500,000のジョブを追加しました。私はpostgresを使ってパフォーマンスの問題を見ていません。ジョブは0.00秒で完了しています。問題を悪化させる仕事の特定の条件はありますか? – Tallboy