linux系统时间暂时跳跃

Zha*_*ang 8 linux time time-synchronization timestamp

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

归功于斯通在评论中提到的 CRON 错误中无法解释的时间跳跃中的原始脚本。

您还可以评论一下您是否正在使用 rsyslog 以及如果是的话是什么版本?您是否在 rsyslog 领域(即 apache 日志等)之外看到它?这个错误看起来很相似,最好确认它或排除它。