Linux系统时间暂时跳跃

Linux系统时间暂时跳跃

我在某些(硬件)服务器中看到了奇怪的系统时间更改行为:在 中/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 ...  

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

我可以确认具有奇怪时间戳的日志消息并非来自任何特定进程 - 它只是可能随机发生在每个进程中。

两次异常时间变化之间的持续时间从几分钟到几个小时不等(但是,我怀疑异常时间变化可能会更频繁地发生,但其中许多没有在系统日志中显示,因为它不是每秒写入日志)。

另外,由于它发生在不止一台服务器上,我认为这不是硬件问题。

有关服务器的更多信息:它们是带有一个控制器和一些计算节点的 OpenStack 安装。每个服务器都运行 ntp 服务。控制器配置为从其自己的硬件时钟获取时间,计算节点服务器从控制器同步时间。请注意,每个服务器都有自己的时间异常变化 - 看起来“错误的时间”没有通过 ntp 从控制器同步。

我怀疑计算节点上的客户系统(虚拟机)可能会影响其主机系统时间。但这并不能解释为什么控制器在没有运行任何虚拟机的情况下也会出现同样的问题。

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

答案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

答案2

复制自:CRON 消息在系统日志中延迟任意长时间:

简而言之,我正在使用的 rsyslog 版本存在一个错误,该错误会延迟收到的系统日志消息任意长度的时间。错误报告在这里。 升级 rsyslog 解决了这个问题。这不是 CRON 的错。

答案3

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

这是可用于更新硬件时钟的命令: 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.

答案4

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

相关内容