Linux
虛擬機的 NodeClockNotSynchronising 上的 Prometheus 警報
我正在嘗試確定為什麼此警報 (
NodeClockNotSynchronising
) 會針對我已配置的少數 VM 觸發。(不是全部,只是幾個,這很奇怪)根據導出的指標,我看到:
# HELP node_timex_sync_status Is clock synchronized to a reliable server (1 = yes, 0 = no). # TYPE node_timex_sync_status gauge node_timex_sync_status 0
我可以 ssh 進入其中一個虛擬機並且
ntpd
正在執行,並且date
命令返回正確的時間。因此,深入研究
timex
收集器文件和程式碼,這就是“失敗”的原因:var syncStatus float64 var divisor float64 var timex = new(unix.Timex) status, err := unix.Adjtimex(timex) if err != nil { return fmt.Errorf("failed to retrieve adjtimex stats: %w", err) } if status == timeError { syncStatus = 0 } else { syncStatus = 1 }
由於 syncStatus 為 0,因此正在觸發警報。深入研究adjtimex()系統呼叫的返回碼:
#define TIME_ERROR 5 /* clock not synchronized */
為什麼核心在執行並且時鐘同步
TIME_ERROR
時會返回?ntpd
任何幫助將不勝感激。
無論您執行的是什麼 ntpd,核心時間規則都會報告錯誤。
有關
man ntp_adjtime
API 和相關常量,請參閱。在 Linux 上,這可能來自 NTP 或 PPS。讓我們假設 NTP,並進一步假設錯誤狀態是
STA_UNSYNC
,未同步。這是在啟動時設置的。如果使用ADJ_OFFSET
mode完成系統呼叫,則清除,換句話說,如果 ntpd 正在嘗試逐漸更改時鐘。這沒有發生是沒有意義的,所有的時鐘都會至少有一點點關閉。查看您的
/etc/ntp.conf
.server
通過orpool
指令確保它包含 4 個或更多源。刪除任何以 .開頭的無紀律的本地時鐘server 127.127.1
。LOCL 已過時,大多數伺服器時鐘並不令人驚訝,並且可能是 0 偏移量阻止了不同步被清除。重新啟動
ntpd
並等待兩分鐘。觀察與 NTP 伺服器相比的偏移量ntpq -p
,或chronyc sources -v
,應該是一位數或兩位數毫秒,但不為零。仔細檢查日期。在不混淆時區的情況下嘗試:
date --utc