あくまでも個人で実際に試した内容であり、これから環境を構築するという方に対しての一つの情報になればいいなと思っています。
環境
-
API
- アプリサーバ(Docker)
- flask v0.12.1
- gunicorn v19.7.1
- keras v2.0.3
- Webサーバー
- nginx
- アプリサーバ(Docker)
-
負荷分散
- Application load balancer
今回やったこと
- c4.xlargeを4台立ち上げて、タスクを4つ作成
- c4.4xlargeを1台立ち上げて、タスクを1つ作成
インスタンスタイプ | vCPU | メモリ |
---|---|---|
c4.xlarge | 4 | 7.5 |
c4.4xlarge | 16 | 30 |
ECSでのリソースの割り当ては以下
- c4.xlargeを使う場合の設定
- c4.4xlargeを使う場合の設定
gunicornがkerasを積んだニューラルネットワークの計算を行うもの、nginx_gunicornはnginx
(微妙なリソースの割り当て割合の差とか出ていますが...)
負荷をかけてみる
Tsungを使って、予測するURLに負荷をかけてみました。
Tsungを積んだDockerで負荷テストを行う
テスト内容は、180秒で2秒間に1回ユーザーが新規にアクセスをするといった感じ
- c4.xlarge * 4
- c4.4xlarge * 1
結論を言うと、今回はスケールアップした方が負荷に対して強かった。
少しグラフの見方があっているかわからないので、正しい確証ないのですがcloudwatchなどと照らし合わせて考えると、c4.xlargeで待ちうける場合、ある時点からレスポンスの時間が低下し始めタイムアウトが発生しエラーが右肩上がりに増える。
感想
最適なリソースの割り当てが、どうするべきかまだDocker運用もニューラルネットワーク用の数値計算ライブラリの運用もペーペーなので、最適解があれば教えて欲しいです