Die Zeit des Linux-Systems springt zeitlich

8

Ich habe auf einigen (Hardware-) Servern ein seltsames Verhalten bei der Änderung der Systemzeit festgestellt: In / var / logs / syslog ändert sich die Datums- und Uhrzeitangabe vor jeder Protokollnachricht manchmal in eine zufällige und wird in der nächsten Nachricht wieder normal, wie folgt:

22. Februar 2018 09:09:30 ...
22. Februar 2018 09:09:32 ...
13. Januar 2610 15:37:42 ...
22. Februar 2018 09:09:33 ...
22. Februar 2018 09:09:34 ...

Wie im Beispiel kann die plötzliche Änderung der Datums- und Uhrzeit bis zu Hunderten von Jahren entfernt sein.

Ich kann bestätigen, dass die Protokollnachrichten mit den seltsamen Zeitstempeln nicht aus einem bestimmten Prozess stammen - sie können nur zufällig für jeden einzelnen auftreten.

Die Dauer zwischen zwei abnormalen Zeitänderungen variiert zwischen einigen Minuten und einigen Stunden (ich vermute jedoch, dass die abnormalen Zeitänderungen häufiger auftreten könnten, aber viele davon werden nicht im Syslog angezeigt, da nicht jede Sekunde Protokolle geschrieben werden).

Da dies auf mehr als einem Server geschieht, gehe ich davon aus, dass es sich nicht um ein Hardwareproblem handelt.

Weitere Informationen zu den Servern: Es handelt sich um eine Openstack-Installation mit einem Controller und einigen Rechenknoten. Auf jedem Server wird ein NTP-Dienst ausgeführt. Der Controller ist so konfiguriert, dass er Zeit von seiner eigenen Hardware-Uhr benötigt, und die Rechenknotenserver synchronisieren die Zeit vom Controller. Beachten Sie, dass jeder Server ungewöhnliche Zeitänderungen in seinem eigenen Tempo aufweist. Es sieht so aus, als ob die "falsche Zeit" nicht über ntp vom Controller synchronisiert wird.

Ich hatte den Verdacht, dass die Gastsysteme (virtuelle Maschinen) auf Rechenknoten die Zeit ihres Hostsystems beeinflussen könnten. Dies kann jedoch nicht erklären, warum der Controller das gleiche Problem hat, wenn keine virtuelle Maschine ausgeführt wird.

Ich brauche eine Methode, um zu erkennen: Wer hat die Systemzeit geändert und wie geschieht dies?

Zhaohui Yang
quelle
2
Können Sie die Ausgabe einer hwclockSchleife anzeigen? Etwas wie:while true; do hwclock; sleep 5; done
Shodanshok
Auf jedem Server wird ein NTP-Dienst ausgeführt: als Client oder als Server? über systemd oder außerhalb von systemd über "alten" ntp-dienst? Für mich sieht dies nach einem Problem mit der NTP-Zeit aus. Wir hatten das Problem, dass wir Protokolldateien geschrieben haben, bevor unsere Zeit synchronisiert wurde (bevor die Netzwerkverbindung hergestellt wurde, was zu Zeitstempelsprüngen führte). systemd hat ein Ziel, auf das Sie sich möglicherweise verlassen möchten. systemd [1]: Die Zeit wurde geändert. systemd [1]: Erreichte Zielsystemzeit synchronisiert.
Dennis Nolte
Es sieht so aus, als würde das Abrufen von Daten als Cron ausgeführt und es ist nicht sehr gut, dies zu überprüfen. Finden Sie es, entfernen Sie es und ersetzen Sie es durch ntpd, das nicht auf große Zeitverschiebungen reagiert.
Danblack
Wir haben neue Erkenntnisse gewonnen und festgestellt, dass das Problem auf CRON-Nachrichten eingegrenzt werden kann, die im Syslog verzögert werden. Also habe ich eine andere Frage gestellt . Bitte schauen Sie dort.
Zhaohui Yang
3
Vielleicht ist dies Ihr Fehler: Unerklärliche Zeitsprünge in CRON, es wurde in rsyslog - 7.4.4-1ubuntu2.7 gepatcht .
Stein

Antworten:

1

Dieses Skript zeigt an, wann eine Zeitverschiebung auftritt und welcher Unterschied im Prozessbaum besteht. Dies sollte Ihnen dabei helfen, dies zu identifizieren, wenn dies durch einen Prozess verursacht wird, der die Systemzeit ändert. Es wird auf dem Terminal gedruckt und in timedrift.log im aktuellen Arbeitsverzeichnis angemeldet.

#!/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

Dank des ursprünglichen Skripts in der unerklärlichen Zeit springt der CRON-Fehler, den Stone als Kommentar erwähnte.

Können Sie auch kommentieren, ob Sie rsyslog verwenden und wenn ja, welche Version? Sehen Sie es außerhalb des Bereichs von rsyslog (dh Apache-Protokolle usw.)? Dieser Fehler sieht einfach aus und es wäre schön, ihn zu bestätigen oder auszuschließen.

Bürger Kepler
quelle
0

Eigentlich ist dies ein Duplikat von @Stones Kommentar. Machen Sie einfach allen klar, dass sie eine Antwort haben.

Kurz gesagt, es gibt einen Fehler in der Version von rsyslog, die ich verwende. Dadurch wird die empfangene Syslog-Nachricht um einen beliebigen Zeitraum verzögert. Fehlerbericht ist hier. Das Upgrade von rsyslog löste das Problem. Es ist nicht die Schuld des Kernels oder von CRON.

Zhaohui Yang
quelle