本文來自戴爾軟件開發高級工程師Stuart Hayesphp
一個關於計時的問題最近引發了個人關注。 有用戶在 Dell 服務器上運行 Linux,而且發現時鐘時間(Linux 所報告的)天天偏差五秒以上,誤差比較明顯。服務器
咱們首先想到的也許是運行 NTP,按期與真實世界同步操做系統的時鐘。ide
可是這樣的偏差最初是如何產生的?spa
在Linux運行時,Linux 系統未使用實時時鐘」(real time clock - RTC) 硬件來計時。 Linux 一般在啓動時從RTC 讀取時間,而後從該點開始,Linux 使用另外一個時鐘來源(系統中的另外一個計時器/計數器)來計時。操作系統
自第 2.6.18 版起,Linux 的內核就使用 CPU 時間戳計數器 (TSC) 做爲首選的時鐘來源(假設 TSC 以恆定頻率運行,以新款的 Intel 服務器 CPU爲例)。 可是,儘管讀取速度很快且解析度很高,TSC 卻不是一個已知的頻率。 當內核使啓動時,它須要使用頻率已知的另外一個計時器,對其進行校準。 這樣的校準並不是完美無缺(即便用於校準的計時器也是如此),所以把 TSC 做爲時鐘來源會形成時間偏差。事件
若是減小時間偏差對您很是重要,而非若干微秒的調度延遲,則最好使用頻率已知的計時器,如大多數 x86 服務器上提供的 HPET(高精度事件計時器)。 藉助新內核上的參數「clocksource=hpet」可實現這一目標。 HPET 計時器以已知、固定的頻率運行,Linux 內核可直接從計時器讀取時間。開發
話說回來,儘管 HPET 的精度高於 TSC,運行 NTP 以在 Linux 中實現長期的時鐘精度始終是很好的想法。get
上述討論僅適用於運行於裸機的 Linux。 在虛擬機中的問題略微複雜。同步
更多精彩文章請關注:虛擬機