BullMQにしてからCPU使用率が高くなる、Deliver等のキューのWaitingが増えた
Summary
~~bullmqになってからjobConcurrencyの挙動が変わったらしく、deliverJobConcurrencyは128がデフォルトだとサーバーがハングしてしまうかもしれない~~
~~deliverJobConcurrencyを8とか16あたりにするべき~~
単純にキューの実行をする際にCPUリソースを食いまくるらしい
謎
(bullの実装が微妙だったのが治ったとかだと思ってた
明らかになんかおかしそう
個人的な感覚ではdeliverJobConcurrencyが128だったのがおかしいと思ってる
同じジョブでもBullMQにしてから負荷が高くなっていそうな雰囲気がある
単純に、ジョブ終了から次のジョブを呼び出すまでの時間が短縮されてジョブの実行数が増えたんだと思ってた
(キューメトリクスウィジェットでジョブが実行できた数は増えているように見える)
misskey.io死んだ?
queueのratelimitの仕様も変わってこっちは結構上方修正してあげないと処理が止まっちゃうかも
(deliverJobPerSec と inboxJobPerSec などの設定、このlimitの適用範囲が完全にグローバルになってるので)
サーバー台数5倍ぐらいに増やしてやっとギリギリ捌けるって感じ 正直このままだと破産するのでなんとかして欲しい
deliverJobConcurrencyを減らしてdeliverJobPerSecを増やすとかしてもダメな感じ?
deliverJobConcurrency減らすと捌ききれなくてどんどん溜まっていく 逆に増やすとCPU使用率がめっちゃ上がってサーバー台数がとんでも無いことになる (通常5/24、現在24/24)
(私はbullに戻す以外の選択肢を考えられない
BullMQのバグ?
bullmqにした以外にキュー実行周りに手を加えていないならbullmqのせいなのでは
何か使い方間違ってるとかかも
まあまずは使い方から疑うべき
https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/daemons/QueueStatsService.ts が重い可能性ないかな
そんなに重たい処理には見えないというか、キュー実行に直接関係あるかしら(tickごとにCPU使用率が増えているわけではなさそうだし)
まさかこれが重たいとか?
これ結局nodeのシングルプロセス性能の問題と直結してるのでOut-Of-ProcessのWorkerにしたいかも
bullの方がなんとかなってるのはどうしてなんだろう
Workerのパフォーマンスプロファイリング@13.13.2(一つだけの連合先にdeliverするテスト)
この条件ではあまりオーバーヘッドがあるようには見えない
謎
同時性の問題なのでジョブが一つの場合は起きないかも ratelimitを10とかにして、ジョブを200個くらい用意した状態でconcurrency 5のワーカーを3台位起動させるとたぶんおそらく何が起きてるかは見えるかも…?(未検証)
配送元と配送先が同一物理サーバーに乗っている場合での実験ですが
ratelimitを10とかにして、ジョブを200個くらい用意した状態でconcurrency 5のワーカーを3台位起動させるとたぶんおそらく何が起きてるかは見えるかも…?
単純にジョブがゆっくり実行されるという想定された動作になるだけで特にオーバーヘッドが増えたりしている様子はなかった
queueのratelimitの仕様も変わってこっちは結構上方修正してあげないと処理が止まっちゃうかも (deliverJobPerSec と inboxJobPerSec などの設定、このlimitの適用範囲が完全にグローバルになってるので)
その通りで、deliverJobPerSecとinboxJobPerSecをclusterLimit倍すればよさそう
deliverJobConcurrencyはHTTPリクエストの待ち時間やDBの待ち時間に(シングルスレッドのワーカーが)ジョブを最大どれだけ並行して回すかという数なので、極端に減らさなければ特に関係なさそう。(https://docs.bullmq.io/guide/workers/concurrency)
deliverJobPerSecを上げれば500 deliver/コアくらいは捌ける模様(Workerの台数を増やして分散させても、一台あたりの効率はそれほど落ちない)
Concurrencyの上げ過ぎ→ジョブごとの毎秒のCPU時間が減る→stalledタイマーの更新が間に合わなくなる→ジョブがstalled状態に→ほかのワーカーにより強制的にwaitingリストに入れられる→リスタート の流れが起きてるのではないかとの予想ですが、小規模では再現性がよくないので何とも言えませんね…
https://docs.bullmq.io/guide/workers/concurrency
https://docs.bullmq.io/guide/workers/sandboxed-processors
こんなことが書いてあったけど…
アクティビティの受信や配送自体はCPU intensiveではなさそう
しかし現にCPUがめっちゃ使われている
動画エンコードとかそういう重い処理は同じプロセスでやると他の全てが止まるからそういう場合はプロセス分離してやってね(=sandbox processor)ってことだと思うからMisskeyおよびこのIssueとは関係なさそう
しかし現にCPUがめっちゃ使われている
sanbox化したところで軽くなるわけではないからなあ