GCEの超絶可用性機能-ライブマイグレーション(Livemigration)の検証をしてみたら凄かった!

皆さん、GCE使ってますか?今更IaaSはもう使ってねーよと言う方にも関係あります、コンテナのベースも所詮はIaaSです。なのでIaaSレイヤでメンテナンスが発生する場合はその上のコンテナは死んじゃいます。そのIaaSレイヤを無停止でメンテナンスさせるというパブリックIaaSではGoogleしか実現していないと言われるライブマイグレーションについて、実際本当に停止しないのか?というところを検証してみた結果、驚きの結果が出ましたので是非ご覧ください。

1.ライブマイグレーションとは無停止で物理ホストを移動してしまう技術

ライブマイグレーションはGCEの基本機能として実装され、このためだけにGCEのG.A.が半年遅れたと言う伝説の機能です。
具体的には、物理サーバ上の仮想マシンの状態を別の物理マシンに事前にコピー・同期を取り続け、ディスクの状態もメモリの状態も完全に一致したあとブラックアウト期間(全停止)を少しだけ設けてTCP/IPレベルでの宛先を旧物理マシンから新物理マシンに切り替えることで、外から見ると全くわからない間に仮想マシンが物理マシン間で移動してしまう、という技術です。

もう少し詳しい内容などは以下の記事を参考ください。
https://qiita.com/kazunori279/items/41520689337a644a87b4

実は、これまではライブマイグレーションはGoogleの社内でだけ行うことが出来る操作でして、特段理由無く検証やテストを実施することが困難でしたが、今年に入ってgcloudコマンド等から操作して発生させることが出来るようになりました。

と、言うことで上記記事でも0.5秒しか停止がないと言う記載がありましたが、本当なのか?という疑問が湧き上がりますよね?ですので、実際に起こして検証してみました。

2.ライブマイグレーションでの停止時間は最大でも200ms程度

さて、実際どう検証したのかというと。

同一のゾーン内のサーバからライブマイグレーションを起こす仮想マシンに対してpingを大量に打って、遅延がどの程度増えるのか、で検証・確認してみました。
ちなみにライブマイグレーションを起こす仮想マシン内からいくらログを取ろうがライブマイグレーションを起こした形跡を検知することは不可能でした。(何か手段が思いつく方は是非教えてください!)

実行環境はシンプルですが以下のような形です。単純に同一ゾーン内で2台のマシンを立てて、ping打ちながらライブマイグレーションを実行する、ということですね。

mig-check → mig-test に以下のコマンドで10msの間隔でpingを実行

コード
ping mig-test -D -i 0.001 > hoge.log
その間にクラウドシェルから以下のコマンドで ライブマイグレーション を実行してみる。
コード
gcloud beta compute instances simulate-maintenance-event mig-test --zone asia-northeast1-b

結果は以下の通り。
ライブマイグレーションはコマンドの後、メモリやディスクの状態を同期する必要があるので、即座にブラックアウトタイムが訪れる訳ではありませんので、そのタイミングを調べるのは少し面倒です。
ライブマイグレーションが起こっているであろうタイミングでpingの遅延が明らかに遅くなる(2ms以上)タイミングを確認し、その影響を確認してみました。通常0.1ms以下くらいで戻ってくるpingが10msを超える程遅れるタイミングの前後のログを抜粋しますと以下です。ライブマイグレーションが起こっているであろう箇所を赤字にしてあります。念のため3回程計測してみました。

○1回目のライブマイグレーション結果

[1530780346.084376] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36700 ttl=64 time=0.092 ms
[1530780346.085407] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36701 ttl=64 time=0.126 ms
[1530780346.086394] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36702 ttl=64 time=0.114 ms
[1530780346.087398] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36703 ttl=64 time=0.119 ms
[1530780346.088775] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36704 ttl=64 time=0.132 ms
[1530780346.089731] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36705 ttl=64 time=0.099 ms
[1530780346.090747] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36706 ttl=64 time=0.118 ms
[1530780346.091738] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36707 ttl=64 time=0.108 ms
[1530780346.164867] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36708 ttl=64 time=72.2 ms
[1530780346.164906] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36715 ttl=64 time=1.11 ms
[1530780346.165028] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36716 ttl=64 time=0.107 ms
[1530780346.166005] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36717 ttl=64 time=0.084 ms
[1530780346.167058] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36718 ttl=64 time=0.137 ms
[1530780346.167983] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=36719 ttl=64 time=0.067 ms

約20msの期間に渡って最大70msの遅延。

○2回目のライブマイグレーション結果

[1530780777.690663] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32552 ttl=64 time=0.094 ms
[1530780777.691647] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32553 ttl=64 time=0.078 ms
[1530780777.692662] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32554 ttl=64 time=0.091 ms
[1530780777.825241] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32555 ttl=64 time=131 ms
[1530780777.825277] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32563 ttl=64 time=50.5 ms
[1530780777.825283] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32564 ttl=64 time=40.3 ms
[1530780777.825287] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32565 ttl=64 time=30.2 ms
[1530780777.825292] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32566 ttl=64 time=20.1 ms
[1530780777.825297] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32567 ttl=64 time=9.98 ms
[1530780777.825487] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32568 ttl=64 time=0.167 ms
[1530780777.826427] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32569 ttl=64 time=0.114 ms
[1530780777.827399] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32570 ttl=64 time=0.087 ms
[1530780777.828511] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32571 ttl=64 time=0.194 ms
[1530780777.829403] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32572 ttl=64 time=0.086 ms
[1530780777.830419] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=32573 ttl=64 time=0.102 ms

約60msの期間に渡って最大131msの遅延。

○3回目のライブマイグレーション結果

[1530781240.760978] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31899 ttl=64 time=0.103 ms
[1530781240.761997] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31900 ttl=64 time=0.118 ms
[1530781240.762973] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31901 ttl=64 time=0.099 ms
[1530781240.909733] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31902 ttl=64 time=145 ms
[1530781240.909762] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31910 ttl=64 time=64.7 ms
[1530781240.909766] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31911 ttl=64 time=54.5 ms
[1530781240.909769] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31912 ttl=64 time=44.4 ms
[1530781240.909783] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31913 ttl=64 time=34.3 ms
[1530781240.909868] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31914 ttl=64 time=24.3 ms
[1530781240.909874] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31915 ttl=64 time=14.1 ms
[1530781240.909930] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31916 ttl=64 time=4.10 ms
[1530781240.909936] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31917 ttl=64 time=0.136 ms
[1530781240.910913] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31918 ttl=64 time=0.113 ms
[1530781240.911910] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31919 ttl=64 time=0.110 ms
[1530781240.912875] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31920 ttl=64 time=0.079 ms
[1530781240.913914] 64 bytes from mig-test.c.cloud-ace-demo.internal (10.240.0.25): icmp_seq=31921 ttl=64 time=0.115 ms

約80msの期間に渡って最大145msの遅延

ということで、パケットロスどころか、100ms以下の期間で最大でも200ms程度の遅延にしかならなそう、ということがわかりました。
ライブマイグレーション、やばいですね。これじゃあ監視でも検知出来ない訳ですよ。

ちなみに、今回は簡易な構成のサーバを使ったためOS上ではライブマイグレーションが起こっているであろう事象を検知出来ませんでしたが、恐らく負荷を大量にかけた状態であれば何かメモリの同期等でオーバヘッドが出るものと思いますが、なかなか明確にはわからないでしょう。
今回はブラックアウト期間の検証でしたので、あまり構成(HDDの容量やメモリサイズ)には影響を受けないであろうということで簡易な構成にて検証しております。

GCEはこのように非常に可用性の高い運用が可能な高度なテクノロジーで構成されてます。GCEのみならずGCP全般についてクラウドエースでは豊富な技術者によるサポートで快適なGCP生活のお手伝いをしておりますので、是非ご相談ください。

次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます