VMware上のゲストOS(Linux)で時刻がズレる

 

 
Linuxアプリーケーションの開発を行っていく上で、今までLinuxの時刻ズレについて
認識はしていたものの気にしていませんでした。
 
ところが、SNMPを利用して経過時間を計測するツールを作ることとなり、時刻ズレ
壁に突き当たってしまい、この問題を調査することにしました。
 
今回の検証環境(ゲストOS)は以下のとおりです。
Product Fedora Core 5
Name kernel
Version 2.6.20
Release 1.2316.fc5
 
 
 
 
 
 
 
Linux上で以下のコマンド(日時の出力→10秒スリープ→日時の出力)を試してみると表示上
正しい結果が出力されます。
# date;sleep 10;date;
2013年  3月  9日 土曜日 10:51:44 JST
2013年  3月  9日 土曜日 10:51:54 JST
 
ですが、ストップウォッチで実際に計測してみると実行時間に16秒も掛かっていました。
因みに今日は"2013年3月12日10:30"ですが、"2013年3月5日 15:30"にdateコマンドで
日時を合わせたばかりなのに、僅か1週間で約71時間38分も遅れているではないですか!

 

実際にsnmpwalkを利用してMIBのsysUpTimeInstance(OID 1.3.6.1.2.1.1.3.0)を上記の
dateコマンドのように取得してみる。
sysUpTimeInstanceとはSNMP管理システムが再起動してから経過した時間
(100分の1秒単位)。
 
# snmpwalk -c public -v 2c 192.168.10.101 .1.3.6.1.2.1.1.3;sleep 10;snmpwalk -c public -v 2c 192.168.10.101 .1.3.6.1.2.1.1.3;
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (33626864) 3 days, 21:24:28.64
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (33627870) 3 days, 21:24:38.70
 
同じように、表示上は正しい結果が出力されますが、実際には16秒掛かっていました。
 
VMwareのknowledgeを調べると「Linux ゲストの時刻管理のベスト プラクティス (1033498)」
という記事が見つかりました。
 
この記事のとおりに、"/boot/grub/grub.conf"内のkernel行の後ろにカーネルオプション
を指定してみたのですが、本検証環境では解決できませんでした。
そこで、さらに調査を進めたところ、kernel行の後ろに"nosmp noapic nolapic"(遅れる
場合)を追加してリブートしたところ解決することができました。
 
 kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet nosmp noapic nolapic
 
進む場合は、"clock=pit"も追加しておくと良いようです。
 
 kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet nosmp noapic nolapic clock=pit
 
ただし、上記のオプションの利用には以下のような注意が必要です。
nosmp は、マルチプロセッサーの設定をシングルプロセッサーの設定に変更してしまいます。
noapic は、マルチプロセッサーで高度な割り込み制御機能の一部を使わなくなります。
nolapic は、Local APICが見つけられなくなるのでCPUは1個しか使われなくなります。
clock=pit は、ゲストOSとホストOS間の時間の同期を効率的に実施するようになります。
 
これで兎にも角にも正しい時間が刻まれるようになったので、SNMPで経過時間を計測
するツールのお話に戻ります。
先ほどMIBのsysUpTimeInstanceを利用したのですがsysUpTimeInstanceSNMP
初期化されてからの経過時間であり、SIGHUPなどのシグナルがsnmpdに送られると経過
時間はリセットされることになってしまう。
そこで、ホストが初期化されてからの経過時間を管理しているhrSystemUptimeを利用
することにしました。
ただ、この辺りはディストリビューション毎の実装によって異なるようです。
 
もう1点、sysUpTimeInstancehrSystemUptimeで管理している値は、497日周期で
バッファオーバーフローが発生してリセットされてしまうため、経過時間測定ツールには
この部分の考慮を行うことにします。