※タイトルを見て、すぐに答えが分かった方は正解へどうぞ
前提
私が開発していたコンテナアプリは、
- 本番環境に ECS(Fargate) + EBS
- 検証環境に EC2 + EBS
を利用していました。
本番環境は ECS で動かしていましたが、検証は EC2 上で簡易的にコンテナを起動することで実施していました。
また、このコンテナアプリは、
- 起動時に、EBS内のGB級データをメモリロードする
- 実行中に、EBS内のSQLiteDBに大量のクエリを実行する
という特性がありました。
EC2 + EBS と ECS + EBS という、一見大きな性能差の無さそうな両者ですが、実際に試してみると、性能差が明らかになりました。
具体的には、
- 起動時のメモリロード速度が3~5倍程度異なる
ということが分かりました。
タイトルの答え
結論から言いますと、ECS + EBS構成の場合に、EC2 + EBS構成よりも遥かにレイテンシーが増加しました。
なぜ、レイテンシーが増加するのか
ECS に永続ボリュームとして EBS をアタッチする場合、既存の EBS をアタッチすることはできません。
そのため ECS と EBS を組み合わせたい場合は、EBS スナップショットを事前に作成し、ECS 起動時に指定してあげる必要があります。
新しい空のボリュームを設定してアタッチすることもできるし、あるいはスナップショットを使用して既存のボリュームからデータをロードすることもできます。
しかし、EBS スナップショットは、初回アクセス時にレイテンシーが著しく低下する問題を抱えています。(これを解消したのがEBSの高速スナップショットです)
スナップショットから作成された新しい EBS ボリュームの各データブロックに初めてアクセスするときには、レイテンシーが著しく増加します。
したがって、ECS 起動直後のメモリロード処理はレイテンシーが著しく増加し、起動時間が3~5倍になってしまったのです。
教訓
- ECS + 永続ボリュームを利用する場合、性能面に特に注意する
→可能であれば、コンテナイメージにデータを含めて、永続ボリュームを使用しない方法も検討する - 性能問題が発生した場合はむやみにECSやFargateを使うのではなく、EC2を使うことも検討する