tail -f /dev/null

If you haven't had any obstacles lately, you're not challenging. be the worst.

AWS Availability Zone間のLatencyはどのくらいなのか

AWS Aurora(Postgres)とEC2のAvailability Zoneが同一である場合とそうでない場合を比較し、リクエストの多いバッチの処理時間が2倍程度掛かっていた(Query durationは同じ)。

Availability Zone間のトラフィックは超高速ファイバーによりLatencyが極めて低い傾向 (1桁msとか)に思われるが、EC2間のLatencyを実際に図ってみた。

f:id:hrt0kmt:20190422065927p:plain

検証

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

f:id:hrt0kmt:20190131175705p:plain

Network receive throughput

f:id:hrt0kmt:20190131181201p:plain

1sec辺りの送受信traffic rateが倍以上異なる。

CPU

f:id:hrt0kmt:20190131181429p:plain

write iops

f:id:hrt0kmt:20190131181654p:plain

バッチの処理時間

  • a: 22min
  • c: 54min

まとめ

結果としては、想像以上にLatencyがある。 リクエストの多いバッチ処理等は、AZが同一か同一でないかで大きく差が開きそうである。Single AZはインフラ構成としてはアンチパターンではあるものの、たしかに開きはあり、大量の連続したトランザクションを処理する場合、ネットワークのlatencyが大きく響く可能性がある。アプリケーション次第ではSingle AZを検討しても良いかもしれない。