結論
何も考えずに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)を追加しますとなっており、このオプションを設定することで完全とは言わないまでもある程度のプロセス同時多発キルを解消できそうだ。
以下は、この記事を書いている時点での最新のコミットIDの該当箇所。
https://github.com/unbit/uwsgi/blob/f17bdbd1b59565a0d6e81e7b825ee6e08ec8e29e/core/uwsgi.c#L299
一見するとさも使えそうなのだが、これを使うためには、最新のmasterブランチから自分でビルドをした場合に使うことが許される。
uWSGIの最新リリースは、現時点では、2.0.18であるが、該当のソースを見に行くとそんなオプションはない。
このオプション自体は5年前から存在はするものの恐ろしいことにstableにのってないのである。
おしまい