NTP時鍾調整策略


一、        問題背景

天威視訊項目3月底發生了一次點播出現節目請求超時的情況,在查詢故障的過程中,發現MAP服務器操作系統的時鍾被向前調整了11秒,姑且不論是否是這個原因導致的故障,但每台服務器在安裝了NTP的情況下,為什么還會一次修改達到11秒情況的時間差,是需要查清的一個事情。

 

此文由博主徐徐原創,轉載請指明出處歡樂世界http://www.happyworld.net.cn

 

二、        問題分析

1、       現象分析

天威視訊項目目前部署的NTP服務是一台MYSQL服務器作為NSP系統的服務端,其他服務器如(IPGAAAMAP等)就同步這台服務器的時鍾,而MYSQL則同步天威自己部署的一台NTP服務器。一個簡單的三層的架構。

 NTP時鍾調整策略 - 不死的蝸牛 - TOMORROW

 

查看了8台MAP,每台MAP都有過調整11秒時鍾的記錄,且每台調整的時間都不一樣,查看時鍾源MYSQL的系統日志,發現是由於MYSQL1的時鍾源調整了11秒的時間,進而引起NSP系統內所有服務器都做了一次同步操作。

 

MYSQL1:  Mar 31 12:08:37 MYSQL1 ntpd[20241]: time reset -11.476554 s

MAP1:    Mar 31 13:06:20 MAP1 ntpd[26731]: time reset -11.476079 s

MAP2:    Mar 31 12:57:42 MAP2 ntpd[25106]: time reset -11.476056 s

IPG1:     Mar 31 12:51:26 IPG1 ntpd[4426]: time reset -11.476588 s

AAA1:    Mar 31 13:14:33 AAA1 ntpd[8932]: time reset -11.476668 s

 

從上面日志可以看出,在MYSQL時間修改后,其他服務器陸續進行了時鍾校正。我們這里暫不討論天威源頭NTP時鍾是否有過11秒的調整,這里討論為何架設了NTP服務之后,時間會一次校正這么大的值。

 

2、       原因分析

經過查詢資料,NTP的時間同步有兩種方式,一種是通過ntpdate進行手動調整(也可以做成定時任務);一種是通過ntpd服務進行自動調整。目前天威部署的NTP全是以第二種ntpd服務的方式配置的。

 

ntpdate就是執行該命令的時候就將客戶端的時鍾與服務器端的時鍾做下同步,不管差異多大,都是一次調整到位。

 

ntpd服務的方式,又有兩種策略,一種是平滑、緩慢的漸進式調整(adjusts the clock in small steps所謂的微調);一種是步進式調整(跳躍式調整)。兩種策略的區別就在於,微調方式在啟動NTP服務時加了個“-x”的參數,而默認的是不加“-x”參數。

 

假如使用了-x選項,那么ntpd只做微調,不跳躍調整時間,但是要注意,-x參數的負作用:當時鍾差大的時候,同步時間將花費很長的時間。-x也有一個閾值,就是600s,當系統時鍾與標准時間差距大於600s時,ntpd會使用較大步進值的方式來調整時間,將時鍾步進調整到正確時間。

 

假如不使用-x選項,那么ntpd在時鍾差距小於128ms時,使用微調方式調整時間,當時差大於128ms時,使用跳躍式調整。

 

這兩種方式都會在本地時鍾與遠端的NTP服務器時鍾相差大於1000s時,ntpd會停止工作。在啟動NTP時加了參數“-g”就可以忽略1000S的問題。

 

以下是man ntpd里關於加參數“-x”的描述:


-x 

Normally, the time is slewed if the offset is less than the step threshold, which is 128 msby default, and stepped if above the  threshold.  This option  sets the threshold to 600 s, which is well within the accuracy window to set the clock manually. Note: Since the slew rate of typical Unix kernels is limited to 0.5 ms/s, each second of adjustment requires an amortization interval of  2000 s. Thus, an adjustment as much as 600 s  will take  almost  14  days to complete. This option can be used with the -g and -q options. See the tinker command for other options. Note: The kernel time discipline is disabled with this option.

 

 

Offset(與服務器的時間差)

0-128ms

128ms-600s

600s-1000s

1000s以上

使用-X參數

微調

微調(速度大約是0.5ms/s,調整600秒要14天左右)

跳躍

退出(加-g參數可忽略)

不使用-X參數

微調

跳躍

跳躍

退出(加-g參數可忽略)

 

 

只有對於跳躍式的校正時間,系統日志才會記錄。

 

天威視訊項目由於是按照跳躍式配置,所以就會一次有修改11秒的情況出現。

3、       驗證測試

針對這兩個策略,我們做了幾個測試驗證:

1、 未加參數“-x”時,如何調整:

將一台測試服務器的時鍾,向前修改了大約6秒鍾左右

[root@AAA3 ~]# date -s 16:15:28

2012年 04月 06日 星期五 16:15:28 CST

同時在NTP服務器端和客戶端執行查詢時間操作,兩者相差6秒。

 

NTP客戶端

NTP服務端

[root@AAA3 ~]# date
2012年 04月 06日 星期五 16:15:34 CST

[root@MYSQL1 ~]# date
2012年 04月 06日 星期五 16:15:40 CS

 

 

然后一直查看NTP客戶端服務器的時鍾同步效果:

 

剛開始,未檢測到時間異常,下一次同步要512秒一個周期。

[root@AAA3 ~]# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

*CC1           172.18.245.1  3  u  132  512  377    1.206    0.806   0.278

 

檢測到與遠端服務器的時間差offset 6289.10單位:ms

[root@AAA3 ~]# date -R

Fri, 06 Apr 2012 16:30:44 +0800

[root@AAA3 ~]# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 CC1             172.18.245.1  3 u   1  512  377    1.208  6289.10 4446.22

 

經過幾次時間的同步,客戶端發現與服務器端時鍾的確是有差異,不是偶然一次的行為,客戶端須得進行相應的調整,於是就進行了一次step的跳躍式時間校正。同步周期poll也由之前的512秒一次,變成每64秒一次(同步不等於就立即調整時間)。同步完后,與服務器的時間差offset 為0ms。

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

*CC1             172.18.245.1   3 u  513  512  377  1.208  6288.98   0.771

[root@AAA3 ~]# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 CC1             .STEP.       16 u  225  64    0   0.000   0.000   0.001

此時再同時查詢服務器端和客戶端的時間:

 

NTP客戶端

NTP服務端

[root@AAA3 ~]# date -R
Fri, 06 Apr 2012 16:56:24 +0800

[root@MYSQL1 ~]# date -R
Fri, 06 Apr 2012 16:56:24 +0800

 

目前時間已經同步正常,查看客戶端的系統日志,可以發現:

[root@AAA3 ~]# tail -f /var/log/messages

Apr  6 16:39:01 AAA3 ntpd[2576]: synchronized to 172.16.100.81, stratum 3

Apr  6 16:56:16 AAA3 ntpd[2576]: time reset +6.288863 s

Apr  6 16:59:49 AAA3 ntpd[2576]: synchronized to 172.16.100.81, stratum 3

 

由此可以驗證,在默認情況下,未加參數“-X”的情況下,NTP在時差大於128ms的情況,是進行的step跳躍式的時間同步。

2、 加參數“-x”時,如何調整:

將一台測試服務器的時鍾,向前修改了大約10秒鍾左右

1502分修改時間

[root@AAA1 ~]# date -s 15:02:16

2012年 04月 06日 星期五 15:02:16 CST

 

 

查詢時間

NTP客戶端

NTP服務端

offset

15:18

[root@AAA1 ~]# date
2012年 04月 06日 星期五 15:18:28 CST

[root@MYSQL1 ~]# date
2012年 04月 06日 星期五 15:18:38 CST

10秒

[root@AAA1 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CC1             172.18.245.1     3 u   61   64  377    0.094  9895.33  81.311

 

 

15:33

[root@AAA1 ~]# date
2012年 04月 06日 星期五 15:33:15 CST

[root@MYSQL1 ~]# date
2012年 04月 06日 星期五 15:33:24 CST

9秒

[root@AAA1 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CC1             172.18.245.1     3 u  102  128  377    0.098  8737.38 225.355

 

 

15:43

[root@AAA1 ~]# date -R
Fri, 06 Apr 2012 15:43:05 +0800

[root@MYSQL1 ~]# date -R
Fri, 06 Apr 2012 15:43:13 +0800

8秒

[root@AAA1 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CC1             172.18.245.1     3 u   97  128  377    0.099  8125.89 508.792

中間一直是微調狀態

18:09

[root@AAA1 ~]# date -R
Fri, 06 Apr 2012 18:09:04 +0800

[root@MYSQL1 ~]# date -R
Fri, 06 Apr 2012 18:09:05 +0800

1秒

[root@AAA1 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CC1             172.18.245.1     3 u  260  512  377    1.325  1241.99 220.343

 

可以看出,NTP一直在同步時鍾,且進行很小的微調,9895.33ms的時間差,調整到1809分還有1241.99ms,之間用了大概3小時來同步8秒多的時間,大概每秒調整0.7ms時間。

 

3、 加參數“-x”時,如何調整(時間差比較偏大,但是小於600s的情況):

我們第二步測試的是10秒時間差的情況,對於更大的時間差,這種微調策略是什么效果呢,我們再進行一個測試驗證:

 

將一台測試服務器的時間修改偏差了70幾秒(1726修改):

[root@AAA3 ~]# date -s 17:26:00

2012年 04月 06日 星期五 17:26:00 CST

 

 

 

查詢時間

NTP客戶端

NTP服務端

offset

17:35

[root@AAA3 ~]# date -R
Fri, 06 Apr 2012 17:35:19 +0800

[root@MYSQL1 ~]# date -R
Fri, 06 Apr 2012 17:36:32 +0800

73秒

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 CC1             172.18.245.1     3 u    6   64  377    0.123  73676.1   9.785

 

 

第二天
10:43

[root@AAA3 ~]# date -R
Sat, 07 Apr 2012 10:43:26 +0800

[root@MYSQL1 ~]# date -R
Sat, 07 Apr 2012 10:43:42 +0800

16秒

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CC1             172.18.245.1     3 u   31   64  377    0.122  16137.3 218.643

 

 

第二天
17:27

[root@AAA3 ~]# date -R
Sat, 07 Apr 2012 17:27:38 +0800

[root@MYSQL1 ~]# date -R
Sat, 07 Apr 2012 17:27:38 +0800

5ms

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CC1             172.18.245.1     3 u   43  256  377    0.135    5.182   0.589

 

 

這次73秒的時間差,用了大概1天的時間,平均每秒調整0.5ms

由此可以驗證,對於小於600s的情況,加了參數“-x”的,不管是10秒還是70秒,500秒,都是進行着這種微調式的時鍾同步策略,NTP服務將這種時間差通過分散到每一秒去逐步進行微調,讓系統基本感覺不到時間上的變化。這樣能保證某些對時間跳動敏感的系統里,能很好的保證業務的安全。

 

4、 加參數“-x”時,如何調整(時間差大於600s):

對於大於600s時間差的情況,我們也做了測試驗證:

 

將時鍾往前調十幾分鍾:

 

查詢時間

NTP客戶端

NTP服務端

offset

17:08

[root@AAA3 ~]# date -R
Fri, 06 Apr 2012 16:55:16 +0800

[root@MYSQL1 ~]# date -R
Fri, 06 Apr 2012 17:08:09 +0800

將時間改為提前13分鍾

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 CC1             172.18.245.1     3 u    -   64    1    0.130    0.077   0.001

 

 

 

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 CC1             172.18.245.1     3 u    2   64  377    0.124  772789. 292086.

772秒

 

 

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 CC1             172.18.245.1     3 u    2   64  377    0.124  772789. 292086.

 772秒

 

 

 

 

0秒 

[root@AAA3 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 CC1             172.18.245.1     3 u   31   64    1    0.136    8.067   0.001

 

17:17

[root@AAA3 ~]# date -R
Fri, 06 Apr 2012 17:17:36 +0800

[root@MYSQL1 ~]# date -R
Fri, 06 Apr 2012 17:17:36 +0800

0秒

 

 

NTP服務大概過了5分鍾后,就將相差的700多秒時間差,一步到位的進行了校正。

查詢系統日志:

Apr  6 17:02:53 AAA3 ntpd[24511]: synchronized to 172.16.100.81, stratum 3

Apr  6 17:15:45 AAA3 ntpd[24511]: time reset +772.789372 s

 

 

Mar 19 10:44:12 yunwei-002 ntpd[3433]: 0.0.0.0 c61c 0c clock_step +763.773061 s

 

三、        問題處理

 

對於VOD點播系統,MAPMYSQLORACLE等模塊都會對一些時間比較敏感(比如節目調度時的定時計划、時移時的時間差等等,數據庫中可能造成某些記錄的創建時間晚於修改時間等等),如果時間不是連續的,而是跳動的,必然對業務有較大的影響。建議后期對NTP策略進行調整。

 

[root@AAA3 ~]# cat /etc/sysconfig/ntpd

# Drop root to id 'ntp:ntp' by default.

OPTIONS="-u ntp:ntp -x  -p /var/run/ntpd.pid"

 

# Set to 'yes' to sync hw clock after successful ntpdate

SYNC_HWCLOCK=no

 

# Additional options for ntpdate

NTPDATE_OPTIONS=""

/etc/sysconfig/ntpd文件中的OPTIONS里增加“-x”參數,重啟ntpd服務即可。

[root@AAA3 ~]# service ntpd restart


免責聲明!

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



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