ECS Fargateで動いているWEBアプリをシステム運用しており、同時600リクエストに耐えられるかどうかテストをしたのでそのメモ。
- ECS FargateのTask定義(Memory, vCPU)と実行タスク数を微調整しながら Apache Bench コマンドで負荷テストを実施
- WEBアプリは PHP 7.2 + Laravel + Apache
- ApacheのPrefork設定はここでは触れない
- 負荷テストのエンドポイントはDBに軽いSELECTを発行して200を返却するだけのプログラムを設置
Task数: 1, vCPU: 1, Mem: 2048MB で負荷テスト
ab -n 300 -c 300 https://foobar.com/database_health_check
Concurrency Level: 300
Time taken for tests: 48.329 seconds
Complete requests: 300
Failed requests: 0
まさにギリギリといった印象、一瞬の高負荷なためECSのAuto Scalingは動きませんでした。
試しに、これを2回連続で実行してみました。
ab -n 300 -c 300 https://foobar.com/database_health_check
Concurrency Level: 300
Time taken for tests: 45.789 seconds
Complete requests: 300
Failed requests: 16
ab -n 300 -c 300 https://foobar.com/database_health_check
Concurrency Level: 300
Time taken for tests: 31.643 seconds
Complete requests: 300
Failed requests: 237
おそらく最初の負荷テストでサーバーがダウンして、Cloud WatchのヘルスチェックがNGとなり、タスクが削除され、新しいタスクが起動されていました。もちろんその間リクエストは届きません。
CPUやメモリ使用率も100%になっていました。
Task数: 2, vCPU: 2, Mem: 4096MB で負荷テスト
タスクも常時2にして、スペックも上げたので
今度は倍にして600リクエストを並列で送ってみます
ab -n 600 -c 600 https://foobar.com/database_health_check
Concurrency Level: 600
Time taken for tests: 25.876 seconds
Complete requests: 600
Failed requests: 0
メモリはMaxで67%, Avgで54%
CPUもMaxで99%, Avgで37%
タスク2個ではこの辺が限界な気がするが、並列1,000リクエストでトライ
ab -n 1000 -c 1000 https://foobar.com/database_health_check
Concurrency Level: 1000
Time taken for tests: 46.078 seconds
Complete requests: 1000
Failed requests: 179
やはりだめでした。。。
メモリはMaxで92%, Avgで87%
CPUもMaxで99%, Avgで34%
2vCPUかつ4GBメモリのApacheで並列300リクエストが限界なのかなぁ。