でこてっくろぐ ねお

UbieのSRE。でこらいふろぐ(http://dekolife.hatenablog.com/)の姉妹版。デコテックログ(deko tech log)である

最近AWSのENIの付け替え速度がチョッパヤになってる気がしたので測ってみた

AWSにおいてサーバの冗長構成をとるための様々な手法の中の一つとして、ENIを移動させることでIPを移動させる方法もあるかと思います。

そのENIの付け替えにかかる時間が最近異様に素早くなってきている気がしたので、すごく雑に測ってみました。及び素早く付け外しするコツも記載してあります。

手動でENIを付け替えたバージョンと、grabeniでENIを付け替えたバージョンの両方があります。

なお、grabeniとは、ちょうど今日書かれた以下エントリにも登場している、go製のENI操作CLIツールです。keepalivedとgrabeniを組み合わせて冗長構成をとるなど、最近便利に使ってます。 developer.hatenastaff.com

結論

  • 手でもツールを使っても、30秒以内くらいでENIを付け替えられそうな感じ
  • 昔はもっと時間がかかっていた気がするけど昔のデータはないので比較できない。次回に期待
    • 昔は2〜3分かかってた気がするという証言が得られた
  • grabeni便利

測り方や環境等

  • pingを打ちながらENIを外して別サーバにつけ、pingが失敗していた秒数を測る
  • pingが疎通していない時間の長さで時間を測る
  • 「だいたい何秒くらい」という情報がわかっていればそれである程度十分だし、特に手でつけたり外したりするの結構面倒なので、それぞれ1回勝負。平均をとったりはしない
  • allow-hotplugの設定をしているため、ENIを付与するだけで勝手にインターフェースが上がってくる環境

手動バージョンの測定

26秒です。

AWSのマネジメントコンソールから手でつけ外しした場合。 EC2サーバが大量に存在する環境にて素早く付け外しするコツがある。そのコツとは、外したENIを付与する際は、ENIからattachするEC2サーバを探すのではなく(サーバが多い環境だと大量のEC2サーバがリストに表れて非常に探しづらい)、attachするEC2サーバにて"ネットワーキング" -> "ネットワークインターフェース" の順で操作することによって、現在使われていないENI(大抵EC2サーバの数より少ないのではないかと思っているがどうでしょうか)から選べば良くなるため、圧倒的に早く済むというものである。

pingの状況

64 bytes from xx.xx.xx.xx: icmp_seq=98 ttl=59 time=xxxx ms
Request timeout for icmp_seq 99
Request timeout for icmp_seq 100
Request timeout for icmp_seq 101
Request timeout for icmp_seq 102
Request timeout for icmp_seq 103
Request timeout for icmp_seq 104
Request timeout for icmp_seq 105
Request timeout for icmp_seq 106
Request timeout for icmp_seq 107
Request timeout for icmp_seq 108
Request timeout for icmp_seq 109
Request timeout for icmp_seq 110
Request timeout for icmp_seq 111
Request timeout for icmp_seq 112
Request timeout for icmp_seq 113
Request timeout for icmp_seq 114
Request timeout for icmp_seq 115
Request timeout for icmp_seq 116
Request timeout for icmp_seq 117
Request timeout for icmp_seq 118
Request timeout for icmp_seq 119
Request timeout for icmp_seq 120
Request timeout for icmp_seq 121
Request timeout for icmp_seq 122
Request timeout for icmp_seq 123
Request timeout for icmp_seq 124
64 bytes from xx.xx.xx.xx: icmp_seq=125 ttl=59 time=xxxx ms

grabeni使用バージョンの測定

18秒。

1回勝負の測定結果なので、優位な差があるかと言われるとそんなにないと思うが、まぁ、手でやるよりはやはり早いよねという結果になった。

なお、その時に打ったgrabeniコマンドは以下のとおりである。ENIを付与したいサーバ上で以下1コマンドを叩くだけでよく大変便利。オプションの-i 1の部分が重要で、grabeniはループ内でiオプションの秒数だけsleepしながらENIのdetachを待ち、detachが完了したらattachするという動きになっているため、この数を減らすことによって、ENIの付け替えを高速化させることができる。デフォルト値は2となっているが、私はいつも1で使っている。

$ grabeni grab -d 1 -i 1 -n 40 eni-xxxxxxxxx

pingの状況

64 bytes from xx.xx.xx.xx: icmp_seq=10 ttl=59 time=xxxx ms
Request timeout for icmp_seq 11
Request timeout for icmp_seq 12
Request timeout for icmp_seq 13
Request timeout for icmp_seq 14
Request timeout for icmp_seq 15
Request timeout for icmp_seq 16
Request timeout for icmp_seq 17
Request timeout for icmp_seq 18
Request timeout for icmp_seq 19
Request timeout for icmp_seq 20
Request timeout for icmp_seq 21
Request timeout for icmp_seq 22
Request timeout for icmp_seq 23
Request timeout for icmp_seq 24
Request timeout for icmp_seq 25
Request timeout for icmp_seq 26
Request timeout for icmp_seq 27
Request timeout for icmp_seq 28
64 bytes from xx.xx.xx.xx: icmp_seq=29 ttl=59 time=xxxx ms

感想

  • 昔はもっと遅かった気がするけどどうだっけなぁ。
  • grabeni便利。
  • この前やった時は10秒くらいで出来た気がしたんだけど勘違いかなぁ。当時のログが残っていない。