這道面試題是開放的。熟悉的情境,很容易給出一個回答。但隨著被面試者思維方式、知識領域及深度的不同,回答可能大相徑庭。
在接著往下閱讀時,你可以先想想自己的答案。
沒理解題目的回答:
- 和新聞聯播對時,“滴”的一聲時,看我的電腦時鐘是多少;
- 我的電腦時鐘和網絡是同步的,很準的;
還算正常的回答:
- 打開兩臺電腦的時鐘,把兩臺電腦的顯示器放一起,拍張照,對比讀數;
- 在兩臺電腦上都設置10點鐘的鬧鐘,看會不會同時響;
電子工程師的回答:
- 你是問CPU的時鐘嗎?給我一臺10G采樣率雙通道的示波器就能看出來了;
- 是系統時間?讓兩臺電腦在收到同一個脈沖信號時,分別報告自己的時間;
網絡工程師的回答:
- 給兩臺電腦發一個廣播,讓它們在收到廣播后立刻報告自己的時間;
- 用了NTP嗎?查看ntpq -p的offset;
……
你可能有更精彩的回答……
本實驗室將采用可操作的、盡可能精確的實驗作為回答。
實驗方案
題目并沒有說兩臺電腦是和時間服務器同步的,所以目的只是測量兩臺電腦之間的系統時間是否一致。
用date命令(高精度選項)直接看一下兩臺主機的系統時間。本地的;遠程的;本地的;遠程的:
user@host1:~$ date -Ins && ssh host2 date -Ins && date -Ins && ssh host2 date -Ins
2017-05-30T10:43:48,185599225+0800
2017-05-30T10:43:48,274676190+0800
2017-05-30T10:43:48,260682724+0800
2017-05-30T10:43:48,350594728+0800
顯然,host2的時間讀數更大一些。但這究竟是host2的時鐘快了,還是ssh調用所花的時間導致的呢?現在還不好說。
假設這個時間差異是T1:
T1 = Diff + RTT12
其中,Diff 是兩臺電腦真實的時間差異,RTT12是host1到host2數據往返所花的時間(嚴格來說是ssh調用所花的時間)。
反方向做同樣的測試:
user@host2:~$ date -Ins && ssh host1 date -Ins && date -Ins && ssh host1 date -Ins
2017-05-30T10:43:51,223937548+0800
2017-05-30T10:43:51,280363886+0800
2017-05-30T10:43:51,296071347+0800
2017-05-30T10:43:51,351845065+0800
host1與host2的時間差異設為T2,則:
T2 = -Diff + RTT21
簡單地認為兩個方向的往返時間是相等的,于是有:
Diff = (T1 – T2)/2
RTT = (T1 + T2)/2
估算一下:
- T1: 89076965, 89912004
- T2: 56426338, 55773718
- Diff: 16325313, 17069143
- RTT: 72751651, 72842861
上面的單位都是ns. 也就是說時間差異是16.3~17.1ms, ssh路途往返耗費72.8ms
這個結果可信嗎?于是寫了一段腳本,把這個測試過程自動化,觀察一段時間的結果。
下圖是每秒測量一次,1個小時的測量數據。為了在對數坐標下顯示,時間差異用絕對值。
說明:
- 起初兩臺電腦的時間差大約1秒,因為開啟了NTP時間同步服務,在某個時刻會突然同步;
- 腳本是Perl寫的,RTT(550ms)比Shell直接執行date命令(72.8ms)大了許多。
實驗1:沒有時間同步時
在沒有時間同步的情況下,觀察2組/3臺主機:A, B, S的時間差異。
A, B, S實際上是在ESXi上的3臺虛擬機。虛擬機的時鐘可能和硬件實鐘會有某種同步策略,所以看到的并不是單方向的變化。
實驗2:與遠程NTP服務器同步
在A,B,S上都開啟NTP服務,時間服務器使用Debian Linux默認的NTP server (x.debian.pool.ntp.org)。
因為幅度懸殊的原因,實際上使用中位數更有意義。可以看到A-S或B-S的時鐘差異在30~50ms.
實驗3:與本地NTP服務器同步;服務器與遠程同步
在A,B,S上都開啟NTP服務,其中A,B與本地的S同步,但S還是與遠程NTP server同步。
可以看到A-S或B-S的時鐘差異在3ms左右,一致性比遠程NTP同步高了一個數量級。
實驗4:與本地NTP服務器同步;服務器使用本地時鐘
在A,B,S上都開啟NTP服務,其中A,B與S同步,但S直接使用本地時鐘,配置為:
server 127.127.1.0 prefer
結果有點出乎意料,時間不一致接近60ms。
實驗5:分時操作系統的執行延時
由于通常的操作系統是非實時操作系統,同樣的指令占用的執行時間并不是固定的。做一個簡單的實驗,看看這個因素對測量會有多大影響。
下圖給出了在兩臺機器上,讀取系統時間(gettimeofday)這一調用所花的時間(各運行500000次)
可以看出99.97%的執行都在1us及以下。這說明分時執行對統計結果的影響很小。
當然,整個ssh調用耗時的波動范圍更大一些(RTT的統計值上可以反映出來)。
結語
用ssh調用讀取另一臺機器上的系統時間,和本地時間比較,并利用雙向ssh調用抵消調用所花的時間,從而可以較準確計算出兩臺主機上的系統時間差。
雖然在分時操作系統上不能保證執行時間的固定,但通過統計可以逼近結果。由于ssh調用所花的時間在0.6ms以下,所以測量的精度至少是1ms級的。
另外,如果用非加密的web調用,或者自己實現遠程調用,應該會有更高的效率,可能會對測量精度略有提高。
利用這一測量,可以觀察NTP的同步效果。如果和遠程NTP服務器同步,時鐘的一致性實測在50ms以內;如果和本地NTP服務器同步,時鐘的一致性在3ms左右;但如果本地NTP服務器使用本地時鐘,一致性會下降很多(60ms左右)。
由于硬件/虛擬機時鐘的波動、網絡的波動、NTP的精度,都導致這種一致性總是處于波動之中。總體上,在局域網內,使用NTP同步,能達到毫秒級的一致性就不錯了。