adjtimex和時鍾的幾個概念tick,freq,ppm,jiffies


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM