AWS Aurora(Postgres)とEC2のAvailability Zoneが同一である場合とそうでない場合を比較し、リクエストの多いバッチの処理時間が2倍程度掛かっていた(Query durationは同じ)。
Availability Zone間のトラフィックは超高速ファイバーによりLatencyが極めて低い傾向 (1桁msとか)に思われるが、EC2間のLatencyを実際に図ってみた。
検証
ping
# a -> a $ ping 10.0.0.10 PING 10.0.0.20 (10.0.0.10) 56(84) bytes of data. 64 bytes from 10.0.0.10: icmp_seq=1 ttl=128 time=0.473 ms 64 bytes from 10.0.0.10: icmp_seq=2 ttl=128 time=0.468 ms 64 bytes from 10.0.0.10: icmp_seq=3 ttl=128 time=0.527 ms 64 bytes from 10.0.0.10: icmp_seq=4 ttl=128 time=0.506 ms 64 bytes from 10.0.0.10: icmp_seq=5 ttl=128 time=0.565 ms 64 bytes from 10.0.0.10: icmp_seq=6 ttl=128 time=0.526 ms 6 packets transmitted, 6 received, 0% packet loss, time 5126ms rtt min/avg/max/mdev = 0.468/0.510/0.565/0.044 ms # a -> c $ ping 10.0.0.20 PING 10.0.0.20 (10.0.0.20) 56(84) bytes of data. 64 bytes from 10.0.0.20: icmp_seq=1 ttl=128 time=2.71 ms 64 bytes from 10.0.0.20: icmp_seq=2 ttl=128 time=2.73 ms 64 bytes from 10.0.0.20: icmp_seq=3 ttl=128 time=2.71 ms 64 bytes from 10.0.0.20: icmp_seq=4 ttl=128 time=2.72 ms 64 bytes from 10.0.0.20: icmp_seq=5 ttl=128 time=2.78 ms 64 bytes from 10.0.0.20: icmp_seq=6 ttl=128 time=2.68 ms 6 packets transmitted, 6 received, 0% packet loss, time 5009ms rtt min/avg/max/mdev = 2.689/2.727/2.784/0.066 ms
Network Throughput
オレンジがEC2と同じAZ aで、青がcである。バッチ実行時間はグラフの通りcが先、aが後でズレがある状態。
Network transmit throughput
Network receive throughput
1sec辺りの送受信traffic rateが倍以上異なる。
CPU
write iops
バッチの処理時間
- a: 22min
- c: 54min
まとめ
結果としては、想像以上にLatencyがある。 リクエストの多いバッチ処理等は、AZが同一か同一でないかで大きく差が開きそうである。Single AZはインフラ構成としてはアンチパターンではあるものの、たしかに開きはあり、大量の連続したトランザクションを処理する場合、ネットワークのlatencyが大きく響く可能性がある。アプリケーション次第ではSingle AZを検討しても良いかもしれない。