LoginSignup
10
5

More than 5 years have passed since last update.

あなたの使ってるuWSGI、本当にmax-requests-delta効いてますか?

Last updated at Posted at 2019-02-21

結論

何も考えずにpipで入れてたら効いてないよそれ。
ネットの記事を見たり、公式のマニュアルを読んだりじゃなく、それだけじゃなくて、採用バージョンのソースまでちゃんと読まないとだめだし、ちゃんと動作検証しないとダメだよってお話。
色々考えた結果、gunicornに移行しました。

発端

現在、携わっている案件でuWSGIが採用されており、性能改善のためのチューニングをしていたところ、よくわからないタイミングでエラーが頻発するケースがあった。

調査

どうにもuWSGIのプロセスがほぼ同時に全部落ちるというタイミングが存在。
このオプションに指定した閾値分のリクエストを処理したworkerは再起動されるという、max-requestsという設定が入っていた。
uWSGIは指定したworker数分のプロセスを立ち上げて動作するため、workerはコア数分あればいいと思う。
uWSGIは、複数のworkerに対して均等に仕事を割りふろうとするので、このmax-requestsにある程度同時に到達する可能性が高く、そうなった時にuWSGIが一切のリクエストが受け付けられなくなる。
例えば、フロントがnginxの場合、一時的に502エラーの嵐となる。
この問題の対策として、max-requests-deltaというオプションがある。

例えば、以下の記事などで説明されている。
https://qiita.com/wapa5pow/items/f4326aed6c0b63617ebd

このオプションは、 uwsgiのマニュアルのここで説明されている。
https://uwsgi-docs.readthedocs.io/en/latest/Options.html?highlight=max-requests-delta#max-requests-delta

説明としては、各ワーカーのmax_requests値に(worker_id * delta)を追加しますとなっており、このオプションを設定することで完全とは言わないまでもある程度のプロセス同時多発キルを解消できそうだ。

このオプションはuWSGIのここで設定されている。
スクリーンショット 2019-02-22 7.28.03.png

以下は、この記事を書いている時点での最新のコミットIDの該当箇所。
https://github.com/unbit/uwsgi/blob/f17bdbd1b59565a0d6e81e7b825ee6e08ec8e29e/core/uwsgi.c#L299

一見するとさも使えそうなのだが、これを使うためには、最新のmasterブランチから自分でビルドをした場合に使うことが許される。

uWSGIの最新リリースは、現時点では、2.0.18であるが、該当のソースを見に行くとそんなオプションはない。
スクリーンショット 2019-02-22 7.29.33.png

このオプション自体は5年前から存在はするものの恐ろしいことにstableにのってないのである。

スクリーンショット 2019-02-22 7.31.23.png

おしまい

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5