misskey-dev / misskey

🌎 An interplanetary microblogging platform 🚀
https://misskey-hub.net/
GNU Affero General Public License v3.0
9.82k stars 1.32k forks source link

Separate ServerService worker and QueueProcessorService worker (and ChartManagementService?) #9262

Open tamaina opened 1 year ago

tamaina commented 1 year ago

Summary

ServerServiceとQueueProcessorService(とChartManagementService)のworkerを分離すれば安定性が増す?
仮にキューワーカーがビジーになってもサーバーワーカーは元気なので応答はできる

(FoundKeyが実装してたので) https://akkoma.dev/FoundKeyGang/FoundKey/commit/2dde8273e2c6ade955223054de49ff36ada59a30

syuilo commented 1 year ago

1workerにつきどれくらいメモリ消費するんだろう

syuilo commented 1 year ago

プロセス分離するとメモリ内キャッシュ(ユーザー情報とか)がそれぞれのプロセスごとに作られることになるから逆に非効率になる部分が出るというデメリットはありそう

syuilo commented 1 year ago

ワーカーが増えることによるメモリ使用量の増加 + キャッシュが分離されることによるメモリ使用量増加とキャッシュヒット率低下 が安定性の向上に見合うコストかどうか 安定性っていうのが何を指してるのかよくわからないけど

syuilo commented 1 year ago

Node.jsにプロセス間通信以外の方法でワーカー間で特定の値を共有する仕組みとかないよね

syuilo commented 1 year ago

👀👀👀 https://stackoverflow.com/questions/51053222/node-js-worker-threads-shared-object-store

syuilo commented 1 year ago

文字列しか共有できないみたいだから使えなさそう

tamaina commented 1 year ago

安定性 = 仮にキューワーカーがビジーになってもサーバーワーカーは元気なので応答はできる

syuilo commented 1 year ago

ビジーというのはCPUについてかしら キューの処理そんなにCPU使うかな

tamaina commented 1 year ago

FoundKeyの実装は各ワーカーの数を調整できるしメモリがカツカツならそこで調整しちゃえばとも思う

1つのワーカーでことを済ませたいという要望があるなら、これまで通り1つのワーカーですべて処理するようにするオプションを設定することもできそう

tamaina commented 1 year ago

私のサーバーはActivityPubのキューをたくさん処理している

(Forkbombを想定してたけどあれ検索攻撃だとキュー関係ないわ

mei23 commented 1 year ago

たぶんめいすきー起因のやつだと思うのだわ https://gist.github.com/mei23/e9ea9b8504bd0ac490ad256259f47715

キューの処理そんなにCPU使うかな

deliverでバーストするので、そのタイミングでserver側のユーザー体験に少しは影響を与えている可能性はあるのだわ。

syuilo commented 1 year ago

プロセス分離するとメモリ内キャッシュ(ユーザー情報とか)がそれぞれのプロセスごとに作られることになるから逆に非効率になる部分が出るというデメリットはありそう

あーよく考えたらQueueProcessorService内でキャッシュ参照する箇所ってない可能性あるな(布団なので未確認)

syuilo commented 1 year ago

やるか

syuilo commented 1 year ago

ChartManagementServiceは分離できない

tamaina commented 1 year ago

個人的な欲求

マスタープロセスがワーカーを作らず全部のことをやるとか

コードいじる必要はあるけどdisableClusteringで行けるのか(こう言うIssueがあった気がするけどどっかいった)