事象
- メモリ使用率が90後半に張り付いたまま、コンテナごとホストに落とされる
- リクエスト数増大につれ、メモリリークっぽい動きをしている
- Worker再起動すれば、メモリ使用率が下がる
調査
-
max_requests
ってオプション使えばリクエスト数ベースでWorkerをリロードしてくれるっぽい - ただし、すべてのプロセスが同時にリロードした場合、リクエストを受け付けられないので、同時に落ちないようにしなきゃならない
-
max_requests_delta
ってオプションでずらせるようにマニュアルに書いてある - なお、
max_requests_delta
はpipからインストールした場合使えない模様 - 利用する場合は、ソースからビルドしなきゃならない
対応
--idle
と--cheap
で一定時間リクエスト来なかったらworkerを停止するようにした
参考
結果
- 一定負荷をかけた後、放置するとメモリ使用率は初期起動時と同程度まで下がった。
- 停止した後のリクエストは起動時間分処理が遅くなる、が許容できる範囲だった。
- 起動時にスパイクがかかった場合のOK/NGはまだ計測していない(これから計測する予定)
まとめ
- 今回やった方法は比較的短い間隔で定期的にリクエストが来るようなアプリケーションでは使えない
- 日中にピークが来て深夜はほぼないみたいなアプリは
idle
を調整して利用時間外に停止するようにするといいかも