linux時間子系統及node-exporter對時鍾的監控


一、linux時鍾原理
在一台計算機上我們有兩個時鍾:一個稱之為硬件時間時鍾(RTC),還有一個稱之為系統時鍾(System Clock)。
系統時鍾就是操作系統的kernel所用來計算時間的時鍾. 它從1970年1月1日00:00:00 UTC時間到目前為止秒數總和的值。在Linux下,系統時間在開機的時候會和RTC硬件時鍾同步(synchronization),之后也就 各自獨立運行了。
系統運行期間,則通過其他硬件時鍾源進行tick計算(tsc、hpet、acpi_pm)。
若安裝了NTP,則通過ntp保證時間的准確性。
 

 

 

 
RTC(real time clock)通過主板(CMOS)的電磁供電,精確到秒。用戶可手工設置RTC時間。
 
查看RTC硬件時鍾(需要root權限)
hwclock -r
 
將系統時鍾同步到硬件時鍾(從/etc/adjtime獲取值,同步到硬件時鍾)
hwclock -w
 
 
將硬件時鍾同步到系統時鍾
hwclock -s
 
查看系統時鍾
date
 
查看操作系統時間的時鍾源(clocksource時鍾源都是通過硬件實現的):
可選源位於:
/sys/devices/system/clocksource/clocksource0/available_clocksource
 
可選項:
tsc:通過CPU頻率計數,可精確到納秒級別。rating=300
hpet:rating=250
acpi_pm:rating=200
rating指標數值越大,越精確
 
當前時鍾源位於:
/sys/devices/system/clocksource/clocksource0/current_clocksource
 
二、查看本地與ntp之間的狀態
ntpq -p
 
remote                       refid          st   t   when  poll  reach   delay     offset     jitter
==================================================================
*10.247.160.31   10.240.241.5   4   u   53       64    377     0.240    0.374    0.240
 
字段 含義 備注
remote前的符號 *表示選取的參考時間 *、+、- 和空白
remote 響應這個請求的NTP服務器的名稱  
refid NTP服務器使用的上一級ntp服務器  
st remote遠程服務器的級別. 由於NTP是層型結構,有頂端的服務器,多層的Relay Server再到客戶端.所以服務器從高到低級別可以設定為1-16. 為了減緩負荷和網絡堵塞,原則上應該避免直接連接到級別為1的服務器的 層數,取值范圍:0-15。16表示不可達
t 未知  
when 上一次成功請求之后到現在的秒數 單位:秒
poll 本地機和遠程服務器多少時間進行一次同步。 在一開始運行NTP的時候這個poll值會比較小,那樣和服務器同步的頻率也就增加了,可以盡快調整到正確的時間范圍,之后poll值會逐漸增大,同步的頻率也就會相應減小 單位:秒
reach 這是一個八進制值,用來測試能否和服務器連接.每成功連接一次它的值就會增加 成功訪問ntp服務器次數,八進制
delay 從本地機發送同步要求到ntp服務器的round trip time 一次訪問耗時,rtt。單位:毫秒
offset 主機通過NTP時鍾同步與所同步時間源的時間偏移量,單位為毫秒(ms)。offset越接近於0,主機和ntp服務器的時間越接近 時間偏差,單位:毫秒
jitter 這是一個用來做統計的值. 它統計了在特定個連續的連接數里offset的分布情況. 簡單地說這個數值的絕對值越小,主機的時間就越精確 我理解為offst的平均值

 

三、node-exporter對時間同步的監控

node-exporter對時間同步監控有2個維度,一個是RTC時鍾與系統時鍾的同步監控;另外一個是NTP與系統時間的同步監控。官網有詳細介紹:https://github.com/prometheus/node_exporter/blob/master/docs/TIME.md

其中,node_timex_offset通過查看源碼確認,是RTC與系統時間的差異

https://github.com/prometheus/node_exporter/blob/master/collector/timex.go

    

 

 

 

源碼中,是通過調用unix的adjtimex函數來計算偏移量的。通過查詢unix的adjtimex函數,即可知道是RTC與系統時間的偏移量。

http://www.hechaku.com/Unix_Linux/adjtimex.html

 

 

另外,在舊版本的Linux中,是存在adjtimex指令的。也能印證adjtimex函數是查看/調整RTC與系統時間的差異

 

 

node-exporter也提供系統時間與NTP之間的差異,但需要開啟ntp collector模塊

如果是docker(docker-compose)啟動的話,加上--collector.ntp參數即可

command: --path.rootfs /host --collector.systemd --collector.ntp --collector.textfile.directory /host/node

 

 

 

參考文章:https://www.aboutyun.com/thread-11395-1-1.html

以上為本人理解,如果錯誤,請指出


免責聲明!

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



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