Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

backend: ワーカープロセスでもリクエストを捌けるようにする #13662

Open
1 task done
samunohito opened this issue Apr 5, 2024 · 14 comments · May be fixed by #15398
Open
1 task done

backend: ワーカープロセスでもリクエストを捌けるようにする #13662

samunohito opened this issue Apr 5, 2024 · 14 comments · May be fixed by #15398
Assignees
Labels
✨Feature This adds/improves/enhances a feature packages/backend Server side specific issue/PR

Comments

@samunohito
Copy link
Member

Summary

タイトルの通りです。

現状、マシンリソースに余裕があるからとワーカープロセスを増やしても、処理速度が上がるのはjobQueueのみであり、主機能のアプリケーション本体部分にはあまり恩恵が無く1、ちょっともったいない感じになってしまっていると思います。

Purpose

リクエスト数の多いサーバで処理速度向上が見込める

Do you want to implement this feature yourself?

  • Yes, I will implement this by myself and send a pull request

Footnotes

  1. Misskeyのバックエンドは、メインプロセスのほかにclusterモジュールを使用してワーカープロセスを立ち上げる造りになっており、メインプロセスではリクエスト→処理→レスポンスの流れを、ワーカープロセスではjobQueueの処理をそれぞれ担っています。

@samunohito samunohito added the ✨Feature This adds/improves/enhances a feature label Apr 5, 2024
@syuilo
Copy link
Member

syuilo commented Apr 5, 2024

あまり効果がないという話があったわね

@samunohito
Copy link
Member Author

実際、WSL2上でMisskeyバックエンドを動かし(+DockerにDBとRedis)、1ミリ秒間隔でnotes/createを叩くツールを90ほど並列で動作させたときに明確な差が出ました。
メインプロセスのみの状態に比べ、ためしにワーカープロセスでリクエストを捌くようにしたものの方が応答間隔が短く、より多数のリクエストを捌けているように見受けられました。

@samunohito
Copy link
Member Author

(もっと性能的な制約が厳しいVMとかレンサバとかだとどうなるかも見てみたい)

@syuilo
Copy link
Member

syuilo commented Apr 5, 2024

データベースのデータ量が増えてくると、Nodeではなくデータベースがネックになるから効果出ないか、むしろ余計にメモリ消費して逆効果になることがあるわね

@syuilo
Copy link
Member

syuilo commented Apr 5, 2024

リクエスト量が多いかつデータベースの負荷がそこまで高くないシチュエーションが実際どれくらいあるかわからないけどその場合は効果が期待できそう

@samunohito
Copy link
Member Author

CPU1コア、メモリ2GBの環境にdocker-composeでアプリ、DB、Redisを詰め込んで、その状態で

1ミリ秒間隔でnotes/createを叩くツールを90ほど並列で動作させたとき

↑をやったらどうなるかの結果次第ですかね。

@samunohito
Copy link
Member Author

(systemdか何かでMisskeyのプロセスを複数立ち上げて運用されている方もいるとどこかで見た記憶があり…そのようなシチュエーションで役に立つかも…?)

@samunohito
Copy link
Member Author

あまり効果がないという話があったわね

ちなみにこれ、どこで言及されたか覚えてらっしゃいますか…?

@samunohito
Copy link
Member Author

この辺も解決できるかもしれない

#10245

@mei23
Copy link
Contributor

mei23 commented Apr 5, 2024

Misskeyのバックエンドは、メインプロセスのほかにclusterモジュールを使用してワーカープロセスを立ち上げる造りになっており、メインプロセスではリクエスト→処理→レスポンスの流れを、ワーカープロセスではjobQueueの処理をそれぞれ担っています。

え?そうだったっけと思ったらつい最近そんな仕様になってたわ
#9662

元のIssueは、Serverをメイン (もちろん1プロセス) にやらせるのではなく、1以上のServer専任Worker と 1以上のQueue専任Worker を上げたいみたいなもの。
#9262

@mei23
Copy link
Contributor

mei23 commented Apr 5, 2024

リソースが固定な1つのマシンで使うという前提の場合、
Server/Queue処理をフレシキブルにプロセスを設定できることのメリットはあるかもしれないけど
大量のリクエストを捌くために、Server処理専用コンテナを大量に立ち上げるような用途の場合
メインプロセス1つでServerまで処理する方が扱いやすいかもしれないわ。

@samunohito
Copy link
Member Author

たしかに。

Server処理専用コンテナを大量に立ち上げる

これはonlyQueueとonlyServerのオプションで実現できそうで、

リソースが固定な1つのマシンで使う

これのうち、そこそこの規模のインスタンスに良さそうなオプションを提供できるか考えるのがこのissueの立ち位置になりそうな感じがしてきました。

@tamaina
Copy link
Contributor

tamaina commented Apr 5, 2024

(これ、どっかの通信面でボトルネックがあるみたいな話じゃなかったっけ?)

@samunohito
Copy link
Member Author

(自分で試してた限りではnodeとdb/redisの間にあると思われるdockerのproxyが悲鳴を上げてた)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature packages/backend Server side specific issue/PR
Projects
Status: Triage
4 participants