adjtimex使用
今天遇到一個ntp的同步問題。服務器上配置好了ntpd,在啟動前也手動進行過同步,但是過段時間ntpq查詢發現服務器即便能選出同步服務器,但是系統的時間偏差越來越大。
服務器上實際有2個時鍾,一個是主板電池驅動的硬件時間(RTC或者CMOS時間),另外就是系統時間。服務器啟動時會從RTC里讀取一次時間,之后便靠中斷來計時。可以設置ntpd同步后講時間寫回RTC.
語法:adjtimex [OPTION]… 主要參數說明:
-p, –print 輸出內核時間變量的值
-t, –tick val 設置內核時鍾計數間隔(微秒)
-f, –frequency newfreq 設置系統時鍾偏移量
-c, –compare[=count] 比較系統時鍾和CMOS時鍾
-i, –interval tim 設置時鍾比較間隔時間 (sec)
-l, –log[=file] 將當前時間記錄到文件中
–host timeserver 查詢時間服務器
-u, –utc 將CMOS時鍾設置成UTC
在服務器上先比較一下系統時間和CMOS時間
# adjtimex --compare
--- current --- -- suggested --
cmos time system-cmos error_ppm tick freq tick freq
1381503971 1.751318
1381503981 1.721794 -2952.4 10000 -1573016
1381503991 1.692179 -2961.5 10000 -1573016 10029 2456959
1381504001 1.662619 -2956.0 10000 -1573016 10029 2097584
1381504011 1.633055 -2956.4 10000 -1573016 10029 2122584
1381504021 1.603491 -2956.4 10000 -1573016 10029 2122584
1381504031 1.573928 -2956.3 10000 -1573016 10029 2117896
1381504041 1.544361 -2956.7 10000 -1573016 10029 2142896
然后使用
# adjtimex -t 10029
修改一下tick,重新手動同步后,再啟動ntpd發現時間終於正常了。
毫秒
毫秒是一種較為微小的時間單位,是一秒的千分之一(0.001秒),簡稱ms。典型照相機的最短曝光時間為一毫秒。一只家蠅每三毫秒扇一次翅膀;蚊子二十毫秒振翅一次;蜜蜂則每五毫秒扇一次。由於月亮繞地球的軌道逐漸變寬,它繞一圈所需的時間每年長兩毫秒。在計算機科學中,10毫秒的間隔稱為一個jiffy。
微秒
微秒(microsecond)即百萬分之一秒(10的負6次秒),簡稱μs。光在這個時間里可以傳播300米,大約是3個足球場的長度,但是海平面上的聲波只能傳播1/3毫米。高速的商業頻閃儀閃爍一次大約持續1微秒。一個BOMB在它的引信燒完之后大約24微秒開始爆炸。
納秒
納秒(nanosecond)即一秒的10億分之一(10的負9次秒),簡稱ns。常用作內存讀寫速度的單位。光在真空中一納秒僅傳播30厘米(不足一個步長)。個人電腦的微處理器執行一道指令(如將兩數相加)約需2至4納秒。另一種罕見的亞原子粒子K介子的存在時間為12納秒。
2. ppm
百萬分之一秒,1個PPM增加
24*3600*(10^6+1)/10^6-24*3600=0.0864s。
PPM 增加500,每天的時差500*0.0864=43.2s
假設服務器現在標准的PPM為 A,為了讓系統24小時慢1s。則ppm的調整為
A- 1*10^6/3600/24=A-11.574074。
3. freq
In struct timex, freq, ppsfreq, and stabil are ppm (parts per
million) with a 16-bit fractional part, which means that a value of 1
in one of those fields actually means 2^-16 ppm, and 2^16=65536 is 1
ppm. This is the case for both input values (in the case of freq)
and output values.
-f newfreq, --frequency newfreq
Set the system clock frequency offset to newfreq. newfreq can be negative or positive, and gives a much finer adjustment than the --tick switch. When
USER_HZ=100, the value is scaled such that newfreq = 65536 speeds up the system clock by about 1 ppm, or .0864 sec/day
因此freq增加65536相當於增加1個PPM(1E-6S)。freq增加65536,每天的影響0.0864s/天。
因為單個freq對時鍾的影響非常小。所以大部分時候不用調整freq,除非是要求比較高的情況下,比如這個機器本身是做時鍾服務器。
4. jiffies
全局變量jiffies用來記錄自系統啟動以來產生的節拍的總數。啟動時,內核將該變量初始化為0,此后,每次時鍾中斷處理程序都會增加該變量的值。一秒內時鍾中斷的次數等於Hz,所以jiffies一秒內增加的值也就是Hz。
系統運行時間以秒為單位,等於jiffies/Hz。
注意,jiffies類型為無符號長整型(unsigned long),其他任何類型存放它都不正確。
將以秒為單位的時間轉化為jiffies:
seconds * Hz
將jiffies轉化為以秒為單位的時間:
jiffies / Hz
相比之下,內核中將秒轉換為jiffies用的多些
5. 工具介紹
1. adjtimex
可以根據和主板上的硬件時鍾作對比,調整系統的每個tick代表的us數和freq,加-c參數會給出建議值。
ubuntu@ip-172-31-23-155:~$ sudo adjtimex -c
--- current --- -- suggested --
cmos time system-cmos error_ppm tick freq tick freq
1484017467 0.491349 10000 1217447
1484017477 0.491537 18.8 10000 1217447
1484017487 0.491743 20.6 10000 1217447 9999 6421047
1484017497 0.491901 15.8 10000 1217447 10000 183072
1484017507 0.492101 20.0 10000 1217447 9999 6460109
1484017517 0.492283 18.2 10000 1217447 9999 6577297
1484017527 0.492490 20.7 10000 1217447 9999 6414797
ntptime
ubuntu@ip-172-31-23-155:~$ ntptime --help
ntptime: unknown option --
usage: ntptime [-MNT:cde:f:hm:o:rs:t:]
-M switch to microsecond mode
-N switch to nanosecond mode
-T tai_offset set TAI offset
-c display the time taken to call ntp_gettime (us)
-e esterror estimate of the error (us)
-f frequency Frequency error (-500 .. 500) (ppm)
-h display this help info
-m maxerror max possible error (us)
-o offset current offset (ms)
-r print the unix and NTP time raw
-s status Set the status bits
-t timeconstant log2 of PLL time constant (0 .. 6)
匯總
| 參數 | 增加單位數 | 1天影響 |
|---|---|---|
| tick | +1 | +8.64s |
| ppm | +1 | +0.0864s |
| freq | +1 | +0.000001318359375s |
簡單的換算 1tick=100ppm=2^16*100 freq
