Zha*_*ang 13 logs timestamps time
我在某些(硬件)服务器中看到了一种奇怪的系统时间更改行为:在 中/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 ...
Run Code Online (Sandbox Code Playgroud)
如示例中所示,日期时间的突然变化可能长达数百年。
我可以确认具有奇怪时间戳的日志消息不是来自任何特定进程 - 它可能对每个进程随机发生。
并且两次异常时间更改之间的持续时间从几分钟到几小时不等(但是,我怀疑异常时间更改可能会更频繁地发生,但其中许多未在系统日志中显示,因为它不是每秒写入日志)。
此外,由于它发生在不止一台服务器上,我认为这不是硬件问题。
关于服务器的更多信息:它们是一个带有一个控制器和几个计算节点的 openstack 安装。每个服务器都有运行的 ntp 服务。控制器配置为从其自己的硬件时钟中获取时间,并且计算节点服务器从控制器同步时间。请注意,每个服务器都有自己的异常时间变化 - 看起来“错误的时间”不是从控制器通过 ntp 同步的。
我怀疑计算节点上的来宾系统(虚拟机)可能会影响它们的主机系统时间。但这并不能解释为什么控制器在没有运行任何虚拟机的情况下会出现同样的问题。
我需要一种方法来检测:谁更改了系统时间以及它是如何发生的?
相关方面是内核版本以及引导过程早期的这些行:
kernel: Fast TSC calibration using PIT
...
kernel: Calibrating delay loop (skipped), value calculated using timer frequency..
...
kernel: Switching to clocksource tsc
Run Code Online (Sandbox Code Playgroud)
YMMV 并且您可能没有使用 TSC 或 PIT
AFAIK 这是一个错误,是由至少一个 CPU 的时钟不同步引起的,在您的情况下可能运行得太快。
通过运行以下命令应该很容易确认:
for cpu in {0..8} ; do taskset -c $cpu date ; done
Run Code Online (Sandbox Code Playgroud)
它将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
Run Code Online (Sandbox Code Playgroud)
另请参阅此输出:
cat /sys/devices/system/clocksource/clocksource*/available_clocksource
Run Code Online (Sandbox Code Playgroud)