我正在尝试确定为什么此警报 ( 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