Linuxシステムの時間は一時的にジャンプします


8

一部の(ハードウェア)サーバーで奇妙なシステム時刻変更動作を見た:/ var / logs / syslogで、各ログメッセージの前の日付時刻が時々ランダムに変化し、次のメッセージのように次のメッセージで通常に戻る:

2018年2月22日09:09:30 ...
2018年2月22日09:09:32 ...
26 10月13日15時37分42秒...
2018年2月22日09:09:33 ...
2018年2月22日09:09:34 ...

例のように、日付時刻の突然の変化は、何百年も離れている可能性があります。

奇妙なタイムスタンプを持つログメッセージが特定のプロセスからのものではないことを確認できます。それは、すべてのプロセスでランダムに発生する可能性があります。

そして、2つの異常な時間の変化の間の期間は数分から数時間の間で変化します(ただし、異常な時間の変化はより頻繁に発生する可能性がありますが、毎秒ログを書き込んでいないため、それらの多くはsyslogで明らかにされません)。

また、複数のサーバーで発生するので、ハードウェアの問題ではないと思います。

サーバーに関する詳細:1つのコントローラーといくつかの計算ノードを備えたOpenStackインストールです。各サーバーでntpサービスが実行されています。コントローラーは、それ自体のハードウェアクロックから時間がかかるように構成され、計算ノードサーバーは、コントローラーからの時間を同期します。各サーバーには独自のペースで異常な時間の変化があることに注意してください。「間違った時間」はコントローラーからntpを介して同期されていないようです。

計算ノード上のゲストシステム(仮想マシン)がホストシステムの時間に影響を与える可能性があると考えていました。ただし、仮想マシンを実行していないときにコントローラーに同じ問題が発生する理由を説明することはできません。

私は検出する方法が必要です:システム時間を変更したのは誰ですか?


2
hwclockループの出力を表示できますか?何か:while true; do hwclock; sleep 5; done
shodanshok

各サーバーでntpサービスが実行されています:クライアントまたはサーバーのどちらですか?systemd経由、またはsystemdの外部の「古い」ntpサービス経由?私にとって、これは提供するntp時間の問題のように見えます。時刻が同期される前(ネットワーク接続が確立される前にタイムスタンプがジャンプする前)にログファイルを書き込んだというこの問題がありましたsystemdには、systemd [1]に依存する可能性のあるターゲットがあります:時刻が変更されましたsystemd [1]:ターゲットシステム時刻に同期しました。
Dennis Nolte

日付のフェッチがcronとして実行されているようで、時間をチェックする時間があまりありません。それを見つけて削除し、大きな時間ドリフトに応答しないntpdに置き換えます。
danblack

新しい発見があり、syslogで遅延しているCRONメッセージに問題を絞り込むことができることがわかりました。だから私は別の質問を投稿しました。そちらをご覧ください。
Zhaohui Yang、

3
たぶんこれはあなたのエラーです:rsyslog-7.4.4-1ubuntu2.7でパッチされたCRON説明できない時間のジャンプ
ストーン

回答:


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

石がコメントとして述べたCRONバグの原因不明の時間ジャンプの元のスクリプトへのクレジット。

rsyslogを使用しているかのようにコメントできますか?rsyslogのレルムの外(つまり、apacheログなど)に表示されますか。このバグは単純に見えますが、確認するか、いずれかの方法で除外するとよいでしょう。


0

実際、これは@Stoneのコメントの複製です。これが答えを持っていることを皆に明確にしてください。

つまり、私が使用しているrsyslogのバージョンにバグがあります。これは、受け取ったsyslogメッセージを任意の時間遅延させます。バグレポートはこちら。 また、rsyslogをアップグレードすると問題が解決しました。カーネルやCRONのせいではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.