はじめに
Twitter を眺めてると AWSでアベイラビリティゾーンをまたいでのアクセスが想像以上に遅かった話 - Qiita という記事が TL に流れていました。AZ をまたぐとアプリの処理時間が3倍程度遅くなったというものです。
AWS の設計について、AWS Certified Advanced Networking Official Study Guide: Specialty Exam (Amazon Web Services, Inc.,2018, p3) を見てみると、AZ 間の通信は基本的に 2ms 以下となるよう作られているとのことです。
実際どんなもんなのか、簡単な実験を行ってみました。
実験
以下のパターンで実測しました。
- 同一AZに順次建てたEC2インスタンス間でpingを10回測定
- 別AZに順次建てたEC2インスタンス間でpingを10回測定
- 同一AZに同時に建てたEC2インスタンス間でpingを10回測定
- 同一AZにプレースメントグループ(pg)を使って建てたEC2インスタンス間でpingを10回測定
結果
結果のサマリを以下の表にまとめました。
# | from | to | boot | pg | rtt | ||||
az | ip | az | ip | min | avg | max | |||
1 | 1a | 10.0.0.146 | 1a | 10.0.0.78 | 順次 | なし | 0.326 | 0.442 | 0.520 |
2 | 1a | 10.0.0.146 | 1c | 10.0.1.160 | 順次 | なし | 2.638 | 2.845 | 4.003 |
3 | 1a | 10.0.0.142 | 1a | 10.0.0.51 | 同時 | なし | 0.373 | 0.460 | 0.630 |
4 | 1a | 10.0.0.35 | 1a | 10.0.0.116 | 同時 | あり | 0.417 | 0.465 | 0.572 |
上記表からわかる情報は以下の通り。
- EC2 インスタンスを1台ずつ順次に建てても、同時に2台建てても、rtt にはほぼ影響がない。
- 同一 AZ 内ではおおむね 0.5ms 程度の rtt となっている。
- 異なる AZ 間では 2ms 台となっており、最も遅いときには 4ms を越えた。
- プレースメントグループを使った場合、同一 AZ 内の測定である #1 や #3 と比較しても大差がなかった
AZ 間の通信は教科書どおりおおむね 2ms 台となりました。AZ 内はだいたい 0.5ms と見て良いみたいです。
プレースメントグループはクラスター/パーティション/スプレッドで結果が変わってくるのかも知れません。
おわりに
おそらく AWSでアベイラビリティゾーンをまたいでのアクセスが想像以上に遅かった話 - Qiita という記事での測定結果は ELB カマしていることから http リクエスト/レスポンスの測定と考えられ、同一 AZ で 100ms ~ 150ms、異なるAZ 間で 300ms ~ 400ms 程度とのことです。
今回の検証結果では、ネットワークレイヤーで3倍~4倍の速度差があり、上記サイトの結果も3倍程度の開きがあることから、ネットワークレイヤーの遅延がアプリレイヤーになってもそのまま影響してそうな印象を受けます。
ミリの世界でシステムを作ってる場合は、同一 AZ 内で処理が終わるようなつくりにすることが求められそうですね。
以上