我在某些(硬件)服务器中看到奇怪的系统时间变化行为:在 /var/logs/syslog 中,每个日志消息之前的日期时间有时会更改为随机日期时间,并在下一条消息中恢复正常,如下所示:
2018 年 2 月 22 日 09:09:30 ... 2018 年 2 月 22 日 09:09:32 ... 2610 年 1 月 13 日 15:37:42 ... 2018 年 2 月 22 日 09:09:33 ... 2018 年 2 月 22 日 09:09:34 ...
正如示例中所示,日期时间的突然变化可能相隔数百年。
我可以确认带有奇怪时间戳的日志消息并非来自任何特定进程 - 它只是可能随机发生在每个进程中。
两次异常时间变化之间的持续时间从几分钟到几个小时不等(但是,我怀疑异常时间变化可能发生得更频繁,但其中许多变化并未在系统日志中显示,因为它不是每秒都写入日志)。
此外,由于它发生在多台服务器上,所以我认为这不是硬件问题。
有关服务器的更多信息:它们是带有一个控制器和几个计算节点的 OpenStack 安装。每台服务器都运行着 ntp 服务。控制器配置为从其自己的硬件时钟获取时间,而计算节点服务器从控制器同步时间。请注意,每台服务器都有自己的异常时间变化 - 看起来“错误时间”没有通过 ntp 从控制器同步。
我怀疑计算节点上的客户系统(虚拟机)可能会影响其主机系统时间。但这无法解释为什么控制器在没有运行任何虚拟机的情况下也会出现同样的问题。
我需要一种方法来检测:谁改变了系统时间以及这是如何发生的?
答案1
此脚本将告诉您时间漂移何时发生以及进程树中的差异,这将有助于识别时间漂移是否是由进程更改系统时间引起的。它将打印到终端,并记录到当前工作目录中的 timedrift.log 中。
#!/bin/bash
oldTime="$(date +%s)"
oldPsOutput="$(ps faux)"
while true; do
sleep 1;
currentTime="$(date +%s)"
oldTimeplusfive="$((($oldTime+5)))"
currentPsOutput="$(ps faux)"
if [[ "$currentTime" -lt "$oldTime" || "$currentTime" -gt "$oldTimeplusfive" ]]
then
(
echo -e '\n\n======================='
echo "currentTime=$currentTime oldTime=$oldTime oldTimeplusfive=$oldTimeplusfive"
echo '-----------------------'
echo "$oldPsOutput"
echo '::::::::::::::::::::::::::'
echo "$currentPsOutput"
) | tee -a timedrift.log
fi
oldPsOutput=$currentPsOutput
oldTime=$currentTime
done
感谢 Stone 在评论中提到的 CRON 错误中无法解释的时间跳跃的原始脚本。
您是否也可以评论一下您是否在使用 rsyslog,如果是,请说明哪个版本?您是否在 rsyslog 范围之外看到它(即 apache 日志等)。这个错误看起来很相似,无论如何确认或排除它都是很好的。
答案2
实际上,这是 @Stone 评论的重复。只需向所有人明确说明这确实有答案即可。
简而言之,我使用的 rsyslog 版本中有一个错误。这将延迟它收到的 syslog 消息任意长的时间。错误报告在这里。 升级 rsyslog 解决了这个问题。这不是内核或 CRON 的错误。