Linux系统时间暂时跳跃


11

我在某些(硬件)服务器中看到了一个奇怪的系统时间更改行为:在中/var/logs/syslog,每条日志消息之前的日期时间有时会更改为随机时间,而在下一条消息中会恢复为正常,如下所示:

Feb 22 2018 09:09:30 ...  
Feb 22 2018 09:09:32 ...  
Jan 13 2610 15:37:42 ...  
Feb 22 2018 09:09:33 ...  
Feb 22 2018 09:09:34 ...  

如示例中所示,日期时间的突然变化可能长达数百年。

我可以确认带有奇怪时间戳记的日志消息不是来自任何特定的过程,而是可以随机发生的。

两次异常时间更改之间的持续时间在几分钟到几小时之间不等(但是,我怀疑异常时间更改可能会更频繁地发生,但是由于系统日志不是每秒写入一次,因此许多未在系统日志中显示出来)。

另外,由于它发生在多个服务器上,因此我认为这不是硬件问题。

有关服务器的更多信息:它们是一个具有一个控制器和几个计算节点的开放式堆栈安装。每个服务器都有正在运行的ntp服务。控制器配置为从其自己的硬件时钟中抽出时间,并且计算节点服务器从控制器同步时间。请注意,每个服务器都会以自己的速度进行异常的时间更改-看起来“错误的时间”不是通过ntp从控制器同步的。

我怀疑计算节点上的来宾系统(虚拟机)可能会影响其主机系统时间。但这不能解释为什么控制器在不运行任何虚拟机时仍存在相同的问题。

我需要一种检测方法:谁更改了系统时间,它是如何发生的?


显示的时间戳是实际时间戳吗?您还有更多示例要显示吗?
库萨兰达

这些服务器是否在刀片服务器中?如果是这样,则刀片服务器机箱管理单元可能正在尝试同步各个服务器刀片的时钟。要查找已知的时钟硬件错误,必须知道实际的服务器型号。
telcoM

您还可以监视硬件时间- hwclock吗?如果它在那个时候也发生变化...
Jaroslav Kucera '18

3
注意,syslogd只是将它从任何进程发送的消息的内容写到适当的日志文件中。时间戳实际上是在消息中发送的,不是syslogd生成的。因此,可能是某些原因破坏了消息,或者如果它是一种类型的进程,则可能是该进程正在发送错误的系统日志消息。仅供参考,格式由RFC3164描述;日期/时间部分以纯ASCII发送。
wurtel '18

请把来自多帖重复项的所有信息放在问题中的superuser.com/questions/1298404
JdeBP '18年

Answers:


1

相关方面是内核版本以及从启动过程开始的几行:

kernel: Fast TSC calibration using PIT
...
kernel: Calibrating delay loop (skipped), value calculated using timer frequency..
...
kernel: Switching to clocksource tsc

YMMV,您可能未使用TSC或PIT

AFAIK,这是由至少一个CPU的时钟不同步引起的错误,在您的情况下,它可能运行得太快。

通过运行以下命令很容易确认:

for cpu in {0..8} ; do taskset -c $cpu date ; done

它将date针对每个cpu 运行(假设您最多有8个内核/线程)。如果我的猜测是正确的,那么您的一个CPU将始终具有错误的时间。

如果是这种情况,那么您应该首先尝试升级内核,如果这样做不起作用,请使用clocksource引导参数(假设它是x86-64):

clocksource=    Override the default clocksource
                Format: <string>
                Override the default clocksource and use the clocksource
                with the name specified.
                Some clocksource names to choose from, depending on
                the platform:
                [all] jiffies (this is the base, fallback clocksource)
                [ACPI] acpi_pm
                ...
                [X86-64] hpet,tsc

另请参见以下输出:

cat /sys/devices/system/clocksource/clocksource*/available_clocksource

0

看来控制器服务器上的硬件时钟不是有关时间的稳定资源。您应该配置控制器以使其类型与更可靠的原子钟同步。

这是您可以用来更新硬件时钟的命令: hwclock -s

也可以看看:

   -s, --hctosys
          Set the System Time from the Hardware Clock.

          Also set the kernel's timezone value to the local timezone as indicated by the TZ environment variable and/or /usr/share/zoneinfo, as tzset(3) would interpret them.  The obsolete tz_dsttime field of the kernel's time‐
          zone value is set to DST_NONE.  (For details on what this field used to mean, see settimeofday(2).)

          This is a good option to use in one of the system startup scripts.

   -w, --systohc
          Set the Hardware Clock to the current System Time.


-1

您应该使用与第1层或第2层源同步的外部NTP服务器,以避免此类异常。硬件时钟不可靠。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.