Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

系統時間跑的飛快?
post by tommy @ 03 九月, 2008 12:12

前幾天突然發現家裡的伺服器時間不對, 快了約半天左右. 因為上頭有跑 ntpd, 照理應該會自動對時, 機器也跑了一年, 之前的時間都很正常, 至少我可以確定在上星期的時候還是正常的. 試著把時間用 ntpdate 對時一次, 隔了不久, 發現時間又不對了, 仔細檢查一下, 發現每分鐘會快六秒, 有 10% 的誤差. 而用 hwclock 看一下 CMOS 上頭的時間, 並沒有相同的問題, 也就是硬體上頭的時間是正常的, 但是 Linux 所計算的時間會愈來愈快.

花了半天的時間, 查不出原因, 所以就先用 cron 每隔兩分鐘跑一次 ntpdate 去對時. 看起來似乎解決了這個問題了.

隔天, 發現 dovecot 不跑了, 看一下 log, 會有 TimeMovedBackwards 的錯誤, 造成 dovecot 自動結束. 也就是每隔一段時間去執行 ntpdate 來對時的解決方法, 雖然時間會比較正確, 不過會造成 dovecot 很容易就中斷執行. 這個方法看來不能用了.

而網頁上頭建議的解決方法, 第一個 ntpd 我已經有跑了, 不過發生了這個問題之後, 看起來似乎 ntpd 並沒有作用 (時間誤差太大的關係?), 所以就抓第二個解決的方案 clockspeed 回來試看看. 不過這個程式, 在家裡的 x86-64 系統上頭編譯不起來, 看起來似乎也不能用了.

到 Google 查了一些資料, 好像都是在 VM 上頭會碰到時間過慢的情形, 可以在 kernel 中加上 clock 或 clocksource 的參數來解決. 不過我試了所有的參數, 都還是有相同的問題. 由於之前是正常的, 所以我也試了一下之前的 kernel 版本, 不過仍然有相同的情形.

後來找到了 The Clock mini-HOWTO 的說明, 裡頭提到了幾個與時間有關的軟體. 發現我的機器上頭有裝 adjtimex 程式, 結果 hwclock, adjtimex 弄來弄去, 發現反而變成每分鐘慢 2 秒. 看來似乎與 adjtimex 有關.

研究一下 adjtimex 的說明, 重新跑了 adjtimexconfig 之後, 發現時間又變快了. 似乎 adjtimexconfig 計算出來的 tick 與 freq 是有問題的. 我直接改 /etc/default/adjtimex 的設定, 把 tick 改到預設的 10000 之後, 時間似乎就很接近了. 後來直接把 adjtimex 移除, 結果 ntpd 似乎就有在運作了, 現在跑了一天, 時間看起來還是對的.

如果你有裝 adjtimex, 試著移除看看, 如果沒裝, 那就裝上去, 試著改 tick 與 freq 的參數看看.
依據 adjtimex manpage 的說明, tick 每增加一, 時間每天會變快 8.64 秒, tick 每減一, 每天會變慢 8.64 秒.
如果依據 tick 的調整之後, 仍有小差異的話, 再利用 (1<<16)*s/.0864 (s 是經 tick 調整後, 每天差異的秒數), 計算出 freq 的數值出來. 這樣子就可以讓 kernel 的時間維持在很正確的情形下.

不過... adjtimex 在我這裝了也很久了, 一直都沒問題, 也不知道為什麼這幾天就有問題. 最後是移除 adjtimex 才讓 ntpd 有作用.

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] Re:系統時間跑的飛快? [ 回覆 ]

是這個原因嗎?
http://tom.knaupp.com/2007/03/09/vmware-time-sync-with-linux-guests-time-is-too-fast/

commons icon [2] Re:系統時間跑的飛快? [ 回覆 ]

並不是 vm 的原因, 我的環境不是 vm, 而且上頭的方法我也試過並沒有作用.

commons icon [3] Re:系統時間跑的飛快? [ 回覆 ]

雖然你的環境不是VM,但是我在 VMware 和 Hyper-V 都遇到相同類似的問題,而我在 CentOS5.3(in GuestOS)上的解決方法如下:

1. 修改 /etc/grub.conf 由原本的:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/
initrd /initrd-2.6.18-128.el5.img
改成:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/ divider=10 clocksource=acpi_pm
initrd /initrd-2.6.18-128.el5.img

2. 修改 /etc/sysconfig/clock,由原本的內容:
ZONE="Asia/Taipei"
UTC=true
ARC=false
改成:
ZONE="Asia/Taipei"
UTC=false
ARC=false

再加上每隔一段時間去執行 ntpdate 來對時(對時要多做一個 clock -w 的動作),調整之後就沒出過這樣的問題。

迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 138 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS