3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(Linux)Hyper-V環境でntpdによる時刻同期がうまく動かない

(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 のところ(太字)が割り込み回数のようです。

ということで、タイマー割り込みのタイミングを広くしてやればいいということですね。

カーネル再構築しなくても、ブートローダーのカーネル起動オプションで設定できるようです。

# vi /boot/grub/grub.conf

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-VLinux運用する上では常識のことなのかもしれません。

参考:

EZ-NET: Hyper-V 上の Linux でシステム時刻を同期する (CentOS 5.4) - Linux の使い方

Hyper-V と NTP(Linux ntpd) 時刻同期の問題 - nekohamawalker's Blog - MASUDAQ.COM Blogger