(Linux)ntpdを使った時刻同期方法で、ntpdによる時刻同期方法を書きました。
しかし、Hyper-V上で動いているLinux(CentOS5.6)でntpdがうまく動かないのです。
(Hyper-V自体にもホストOSとゲストOSの時刻同期機能があり、Linux-IS2.1でも対応してるらしいですがはやり狂ってしまいます。なので、ntpによる同期は必要です)
ntpq で ntpd の状況をみると下記のようになります。
# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntpsvhogehoge.c 10.10.1.100 4 u 4 128 377 0.386 -3419.5 1233.04
*LOCAL(0) .LOCL. 10 l 48 64 377 0.000 0.000 0.001
NTPサーバに同期せず自分自身に同期しようとしています。
で、いろいろ調べた結果、VMwareの時刻あわせ 2008年冬版 - SH2の日記で原因を見つけました。
どうやら、LinuxKernel 2.6.18 ではタイマー割り込みが秒間1000回(1msおき)に走っているようです。
このタイマー割り込みによって時刻も進んでいるわけですが、割り込み回数が多すぎてHyper-Vが割り込みを取りこぼしてしまうことが原因のようです。
補足ですが割り込み回数はvmstatで分かるようです。
# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 60 14840 86640 705432 0 0 26 4 16 32 0 1 99 0 0
0 0 60 14840 86640 705432 0 0 0 0 1033 31 0 1 99 0 0
0 0 60 14840 86640 705432 0 0 0 0 1013 27 0 0 100 0 0
system の in のところ(太字)が割り込み回数のようです。
ということで、タイマー割り込みのタイミングを広くしてやればいいということですね。
カーネル再構築しなくても、ブートローダーのカーネル起動オプションで設定できるようです。
title CentOS (2.6.18-238.9.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-238.9.1.el5 ro root=/dev/VolGroup00/LogVol00 hda=noprobe hdb=noprobe divider=10 clocksource=acpi_pm
initrd /initrd-2.6.18-238.9.1.el5.img
カーネル起動パラメータにdivider=10 clocksource=acpi_pmを追加してやればいいようです。
divider で指定した間隔でタイマー割り込みが入るようです。(10なら10msおきに割り込み、つまり秒間100回となる)
clocksource=acpi_pm とすることで、divider指定時のハングする問題を回避できるようです。
これで再起動して、しばらくしてからntpqで確認するとちゃんと動いていました。
# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntpsvhogehoge.c 10.10.1.100 4 u 182 256 377 0.274 -58.869 19.775
LOCAL(0) .LOCL. 10 l 7 64 377 0.000 0.000 0.002
いざ探すと、結構情報が見つかったので、Hyper-VでLinux運用する上では常識のことなのかもしれません。
参考:
EZ-NET: Hyper-V 上の Linux でシステム時刻を同期する (CentOS 5.4) - Linux の使い方
Hyper-V と NTP(Linux ntpd) 時刻同期の問題 - nekohamawalker's Blog - MASUDAQ.COM Blogger