一部の(ハードウェア)サーバーで奇妙なシステム時刻変更動作を見た:/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 ...
例のように、日付時刻の突然の変化は、何百年も離れている可能性があります。
奇妙なタイムスタンプを持つログメッセージが特定のプロセスからのものではないことを確認できます。それは、すべてのプロセスでランダムに発生する可能性があるだけです。
そして、2つの異常な時間の変化の間の期間は数分から数時間の間で変化します(ただし、異常な時間の変化はより頻繁に発生する可能性がありますが、毎秒ログを書き込んでいないため、それらの多くはsyslogで明らかにされていません)。
また、これは複数のサーバーで発生するため、ハードウェアの問題ではないと思います。
サーバーに関する詳細:1つのコントローラーといくつかの計算ノードを備えたオープンスタックインストールです。各サーバーでntpサービスが実行されています。コントローラーは、それ自体のハードウェアクロックから時間がかかるように構成されており、計算ノードサーバーは、コントローラーから時刻を同期します。各サーバーには独自のペースで異常な時間の変化があることに注意してください。「間違った時間」はコントローラーからntpを介して同期されていないようです。
計算ノード上のゲストシステム(仮想マシン)がホストシステムの時間に影響を与える可能性があると考えていました。ただし、仮想マシンを実行していないときにコントローラーに同じ問題が発生する理由を説明することはできません。
検出する方法が必要です。システム時刻を変更したのは誰ですか、どのようにして発生しますか?
関連する側面は、カーネルバージョンと、ブートプロセスの初期の次の行です。
kernel: Fast TSC calibration using PIT
...
kernel: Calibrating delay loop (skipped), value calculated using timer frequency..
...
kernel: Switching to clocksource tsc
YMMVおよびTSCまたはPITを使用していない可能性があります
これは、少なくとも1つのCPUのクロックが同期していないために発生しているバグであると考えられます。
これを実行することで簡単に確認できます:
for cpu in {0..8} ; do taskset -c $cpu date ; done
各CPUに対してdate
を実行します(最大8コア/スレッドであると想定)。私の推測が正しい場合、CPUの1つは常に間違った時間になります。
その場合は、まずカーネルをアップグレードしてみてください。それがうまくいかない場合は、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
コピー元: CRONメッセージがsyslogで任意の長い時間遅延している :
要するに、私が使用しているrsyslogのバージョンにはバグがあり、それが受け取ったsyslogメッセージを任意の時間遅延させます。 バグレポートはこちらです。 そして、rsyslogをアップグレードすると問題が解決しました。 CRONのせいではありません。
コントローラサーバーのハードウェアクロックは、時間に関する安定した情報源ではないようです。コントローラのタイプをより信頼性の高い原子時計と同期するように設定する必要があります。
これは、ハードウェアクロックの更新に使用できるコマンドです: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.