***本記事にはプロモーションが含まれています。***
このところずっとVirtualBoxを使っていて、ゲストOSの時計が遅れていることに気がつきました。なんか変だということで、精度を簡単に測ってみることにしました。
クロックソースによる時計のおくれの違い
準仮想化クロックkvm-clockは、/sys/devices/system/clocksource/clocksource0/current_clocksourceでクロックソースとして指定しています。その他にも変えられるものがあるので、準仮想化ではなくなってしまいますがクロックソースを変えてみます。
$ sudo sh -c "echo tsc >/sys/devices/system/clocksource/clocksource0/current_clocksource"
で変えられます。
変えられるのは、cat /sys/devices/system/clocksource/clocksource0/available_clocksourceで確認できます。
tsc(Time Stamp Counter)というのは、CPUの刻む時計です。acpi_pm(ACPI Power Management Timer)というのは、ACPIというパソコンの規格で定められている精度の高いタイマーです。
また、VirtualBoxの準仮想化インターフェースでKVMのほかに、Legacyと”なし”にしたときも同様に測ってみます。
計測は手元のストップウォッチで5分を計測して、dateコマンドで秒単位の変化を見ました。
ホストWindows 7 x86_64 ultimate、ゲストUbuntu 12.04 x86_64です。VirtualBoxは5.0で、GuestAdditionsを入れてあります。
準仮想化インターフェースがKVMのとき
準仮想化インターフェースをKVMにしてかかった時間を計測します。
実時間 | kvm-clock | tsc | acpi_pm |
---|---|---|---|
5分00秒 | 4分54秒 | 4分54秒 | 5分00秒 |
kvm-clockとtscのときは、5分経過したとき6秒も時計が遅れていました。acpi_pmにしたときは、ほぼ5分になります。
kvm-clockはtscをつかっているので、kvm-clockがずれているのはtscが原因だと思います。
準仮想化インターフェースがLegacyのとき
準仮想化インターフェースのLegacyがよくわからなかったので、計測してみました。
実時間 | tsc | acpi_pm |
---|---|---|
5分00秒 | 5分00秒 | 5分00秒 |
tsc、acpi_pmの両方とも正確に測れています。
準仮想化インターフェースがなしのとき
準仮想化インターフェースをなしにしたときも測定してみました。
実時間 | tsc | acpi_pm |
---|---|---|
5分00秒 | 5分00秒 | 5分00秒 |
tsc、acpi_pmともに時計は正確でした。
KVMでkvm-clockを使ったとき
時計の遅れがゲストOSのkvm-clockドライバーの問題なのか、VirtualBoxの準仮想化インターフェースの問題なのかはっきりさせるため、KVMを使ってみました。
LinuxのホストマシンがないのでVMware Playerを使ってKVMを仮想環境で動かしました。
ホストOSは、Windows 7 x64 Ultimate上でVMware Player 7.1.2のIntel VT-x/EPTまたはAMD-V/RVIを仮想化という機能を使ってUbuntu 14.04 x86_64を動かしました。
Ubuntu 14.04 x86_64上でQEMUの開発バージョンでKVMを使います。
ゲストOSは、Ubuntu 12.04 x86_64です。
実時間 | kvm-clock |
---|---|
5分00秒 | 5分00秒 |
とくに大きな遅れは見られなかったです。ホストOSが複雑なので難しいのですが、kvm-clockが遅れの原因ではなさそうです。
準仮想化クロックを使っても時計が正確にならない
残念ですね。せっかく準仮想化クロックを導入しても時計が正確ではないです。VirtualBoxが1分で1秒以上遅れてしまうのは問題ですね。
マニュアルを読むとGuestAdditionsが時計を補正するとあります。どういう場合に補正されるのかが気になります。少なくとも準仮想化クロックをKVMにしたときは、補正されていないです。
準仮想化インターフェースのLegacyは、VBoxManageのヘルプを読むとVirtualBox 5.0以前に作られた仮想マシンを5.0以降で起動すると自動的に設定されるとあります。VirtualBoxのログを読むとLegacyが選ばれたときは準仮想化インターフェースとしてnone(なし)が選ばれています。そのため、Legacyとnoneは実質的な違いはないと思います。
何が原因で時計が遅れているのかを調べるため、次回ソースコードを追いかけて検討しようと思います。