ゲストOSの時計の遅れにはティックレスLinuxカーネルが関係していた
このところVirtualBoxを契機として、準仮想化クロックについて調べてきました。
ところが、SUSEのマニュアルがゲストOSでNTPを使わないことを推奨していることの理由がどうしてもわかりませんでした。
昔QEMUにかかわったとき、Linuxの割り込み頻度が1000Hzから250Hzに変わったことを思い出しました。
すると、こんな記事が見つかりました。
最近のLinuxカーネルはティックレスになっていて、仮想化しても時刻がずれないというのです。そこで、ティックレスカーネルについて調べてみました。
Linuxの割り込み頻度の変遷
VMwareのサイトにLinuxの割り込み頻度の変遷がまとめられています。
Linuxの2.4ではHZ=100Hzだったのが、2.6ではHZ=1000Hzに変わり、2.6.14以降はHZ=250Hzになっています。
ティックレスカーネルのサポートはLinux 2.6.18より始まっています。
ティックレスカーネルのしくみ
昔はPIT(Programmable Interval Timer)を使って定期的に割り込みをかけていました。100Hzなら10msに一度カーネルに割り込みが発生するようにプログラムします。割り込みが発生したら10msたったとして時計を進めていたわけです。
Linuxの割り込み頻度は、多いほうが時計の精度が高いように思います。しかし割り込みの時間内に処理が終わらず次の割り込みが起こってしまうと割り込みが失われた状態になり時計が狂ってきます。
仮想化環境で時計の狂いが大きかったのはこれが大きな原因です。
ティックレスカーネルは時間を決めて定期的に割り込みをかけることをやめてしまうものです。その代わり1度きりのone shot timerというタイマーを使って割り込みまでの時間を設定して割り込みをかけます。動いているプロセスが少ないときは長い時間割り込まないようにします。動いているときは、定期的に割り込みます。
時間があらかじめ決まっていないので、カーネルがsleepしてどれくらい時間がかかったかを毎度ハードウェアをチェックする必要があります。それをクロックソースと呼んでいます。
クロックソースとして代表的なものが、TSC(Time Stamp Counter)、ACPI PM(ACPI Power Management timer)、HPET(High Precision Event Timer)などがあります。
ティックレスカーネルの適用状況
Linuxのディストリビューションがティックレスカーネルを採用した時期はまちまちです。以下にまとめてみました。
ディストリビューション | バージョン | 時期 |
---|---|---|
Red Hat Enterprise Linux | 6 | 2010-11-09 |
CentOS | 6 | 2011-07-10 |
Fedora | 7 x86 | 2007-05-31 |
Fedora | 8 x86_64 | 2007-11-8 |
Ubuntu | 7.10 | 2007-10-18 |
SUSE Linux Enterprise Server | 12 | 2014-10-28 |
UbuntuとFedoraが同時期で、Red HatとCentOSが次で、SUSEの順番です。
使っている人が多いと思われるCentOSは6からのサポートです。最近になって時計の話題を見かけることが少なくなったことはこのためだと思われます。
また、Ubuntuの方が時計が正確だという報告があったのですがティックレスカーネルの採用時期が早かったためでしょう。
SUSEは本当に最近のサポートですね。
ティックレスカーネルと準仮想化クロックと組み合わせると
ティックレスカーネルになってクロックソースを指定できるようになりました。最近のディストリビューションでは準仮想化クロックを採用しているところばかりです。準仮想化クロックといってもこれまで調べたようにその中身はTSCを使っています。ゲストOSの時計が正確になったのは、CPUの周波数の変化によってTSCの周波数が変化しなくなっていることも大きいと思います。
Linuxカーネルの進化とCPUの進化によって時計の正確さが増したということでしょう。