経緯
Waitress+Flaskで作成したWebAPIをFargateで動かしたが、1,2件は8sで処理が終わるが10件の同時リクエスト時に1mを超えてしまった。根気強く試行錯誤し解決しましたが同様の情報がネット上に確認できなかったので、
同じ状態で悩む人の為に記事にしたいと思います。
使用環境
AWS ECS FargateDocker
Waitress
Flask
その他WebAPIに必要なサービス(本件に関係ないため省略)
試したこと
Waitressのthreadsやconnection_limitの調整とFargateのvCPU、メモリの調整。解決方法
FargateのvCPU、メモリの調整をするのではなくタスクの数を調整する。問題の発生から解決までの過程
まずWaitressのthreadsを100、connection_limitを500に設定した。 2vCPU 6GBで1件の処理がうまくいったため同時リクエスト(10件)の時間を計測した。 その際に時間が1mを超えてしまったためvCPUとメモリを増やすことにした。16vCPU 32GBで処理を行ったが時間があまり変わらなかった。
メトリクスで負荷を確認すると特段負荷はかかっていなかった。
そこで思い至ったのが2vCPUでも16vCPU使用されているスレッドが少ないのではないかということです。
実際1vCPUと2vCPUでは差が出ましたがvCPUを2より大きくしても処理時間に大きな変化はなく、むしろ時間が多くなっていました。
解決策としてまずどのvCPUとメモリの組み合わせが処理に最適化を調整し、
リクエスト数に応じてタスクを増やすといった結論に至りました。
以上になります。
所感
Javaの開発エンジニアのつもりなのですがいきなりサーバの調整を任されたのでやることになりました。vCPUを増やせば使えるスレッドも増えるだろうと勝手に思っていたのですがそうでもないんですかね。
もしもっと良い解決方法などがあればコメントにてご教示いただけますと幸いです。
インフラエンジニアの方からしたら常識的な内容だったのかなと勝手に思いつつ終わります。