非常にショボいのだけれど、FastapiサーバのコンテナのCPU負荷が異様に高くて、常にCPU利用率が20%以上で困っていた。結論だけ言うと、 --reload
オプションをつけているせいだった。とてもショボい。
症状
CPUの利用率が常に高い。
uvicornめっちゃ使ってる。何故に?
原因と対応
めっちゃショボいんだけれど、DockerfileのENTRYPOINTでuvicorn実行するときに --reload
オプション付けているせいだった。
ENTRYPOINT [ "poetry", "run", "uvicorn", "api.main:app", "--host", "0.0.0.0", "--reload" ]
練習のための参考書にある記載そのまま使ったから……。
--reload
を外したら大人しくなった。
ですよね。
ChatGPTの--reloadに関する有り難いお言葉
--reloadは開発用のオプションで、コードが変更されるたびにアプリケーションを自動で再起動する機能です。しかし、この機能はファイルの変更を監視するために別のプロセスを立ち上げているため、CPU使用率が高くなる傾向があります。特に、Dockerコンテナ内で使用している場合はファイルシステムの違いやオーバーヘッドのため、さらにCPU使用率が上がることが考えられます。
対策
• 本番環境では--reloadオプションを外し、代わりに--workersを適切な数に設定して、並列処理のパフォーマンスを向上させましょう。
--workersオプションは、uvicornで同時に動作するワーカー(プロセス)の数を指定するものです。通常、ワーカー数を増やすことで同時に処理できるリクエスト数が増え、アプリケーションのパフォーマンスが向上します。
デフォルトでは1つのワーカーで処理されますが、--workersオプションを設定すると、その数だけワーカープロセスが立ち上がり、リクエストの負荷を分散して処理します。一般的に、ワーカー数はサーバーのCPUコア数に合わせて設定するのが推奨されます。例えば、4コアのCPUであれば--workers 4のように指定するのが目安です。
なお、ワーカー数が多すぎると逆にCPUリソースが過負荷になる可能性があるため、適切なバランスを見つけることが重要です。
参考
ありがとうございました。
ChatGPTにも聞いたけれど無能の極みで解決には役立たなかった。やはり人間……人間がすべてを解決する。
でも「そのCPU負荷は頭おかしいから原因調べた方がいいよ」と言ってくれたのはよかったし、「これが原因?」と聞いたらその可能性が高いともっともらしい説明をしていたが、まぁ理解は深まった。「本番環境ならCPUコアと同じ数の --workers
オプションつけるといいよ」と教えてくれたのでよしとする。
この本よかった
コメント