Dies wird durch eine Livesperre verursacht, wenn ntpd adjtimex (2) aufruft, um den Kernel anzuweisen, eine Schaltsekunde einzufügen. Siehe lkml-Posting http://lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html
Red Hat sollte auch seinen KB-Artikel aktualisieren. https://access.redhat.com/knowledge/articles/15145
UPDATE: Red Hat hat einen zweiten KB-Artikel nur für dieses Problem hier: https://access.redhat.com/knowledge/solutions/154713 - der vorherige Artikel bezieht sich auf ein früheres, nicht verwandtes Problem
Die Problemumgehung besteht darin, ntpd einfach auszuschalten. Wenn ntpd den Aufruf adjtimex (2) bereits ausgegeben hat, müssen Sie möglicherweise ntpd deaktivieren und neu starten, um 100% sicher zu sein.
Dies betrifft RHEL 6 und andere Distributionen mit neueren Kerneln (neuer als ca. 2.6.26), jedoch nicht RHEL 5.
Der Grund dafür, dass dies geschieht, bevor die Schaltsekunde tatsächlich geplant ist, ist, dass der Kernel mit ntpd die Schaltsekunde um Mitternacht verarbeiten kann, den Kernel jedoch warnen muss, die Schaltsekunde vor Mitternacht einzufügen. ntpd ruft daher irgendwann am Tag der Schaltsekunde adjtimex (2) auf, an welchem Punkt dieser Fehler ausgelöst wird.
Wenn Sie adjtimex (8) installiert haben, können Sie mithilfe dieses Skripts feststellen, ob Flag 16 gesetzt ist. Flag 16 ist "Schaltsekunde einfügen":
adjtimex -p | perl -p -e 'undef $_, next unless m/status: (\d+)/; (16 & $1) && print "leap second flag is set:\n"'
AKTUALISIEREN:
Red Hat hat den KB-Artikel folgendermaßen aktualisiert: "RHEL 6-Kunden sind möglicherweise von einem bekannten Problem betroffen, das dazu führt, dass NMI Watchdog beim Empfang der NTP-Schaltsekunden-Ankündigung einen Stillstand erkennt. Dieses Problem wird rechtzeitig behoben. Wenn Ihre Systeme empfangen werden die Schaltsekundenansage und dieses Problem nicht aufgetreten, dann sind sie nicht mehr betroffen. "
UPDATE: Die oben genannte Sprache wurde aus dem Red Hat-Artikel entfernt. und eine zweite KB-Lösung wurde hinzugefügt, die das Absturzproblem von adjtimex (2) detailliert beschreibt: https://access.redhat.com/knowledge/solutions/154713
Die Codeänderung im LKML-Beitrag von IBM Engineer John Stultz weist jedoch darauf hin, dass möglicherweise auch ein Deadlock vorliegt, wenn die Schaltsekunde tatsächlich angewendet wird. Sie können die Schaltsekunde daher deaktivieren, indem Sie einen Neustart durchführen oder adjtimex (8) nach dem Deaktivieren von ntpd verwenden.
FINAL UPDATE:
Nun, ich bin kein Kernel-Entwickler, aber ich habe den Patch von John Stultz hier noch einmal durchgesehen: https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h = 6b43ae8a619d17c4935c3320d2ef9e92bdeed05d
Wenn ich es dieses Mal richtig lese, habe ich mich geirrt, dass es einen weiteren Deadlock gibt, wenn die Schaltsekunde angewendet wird. Dies scheint auch Red Hats Meinung zu sein, basierend auf ihrem KB-Eintrag. Wenn Sie jedoch ntpd deaktiviert haben, lassen Sie es weitere 10 Minuten deaktiviert, damit Sie nicht den Deadlock erreichen, wenn ntpd adjtimex (2) aufruft.
Wir werden bald herausfinden, ob es weitere Bugs gibt :)
ZWEITES UPDATE NACH DEM LEAP:
Ich habe die letzten Stunden damit verbracht, den ntpd- und Pre-Patch- (Buggy-) Kernel-Code durchzulesen, und obwohl ich mich hier sehr irre, werde ich versuchen zu erklären, was meiner Meinung nach vor sich ging:
Zunächst ruft ntpd die ganze Zeit adjtimex (2) auf. Dies geschieht im Rahmen des "Clock Loop Filters", das in local_clock in ntp_loopfilter.c definiert ist. Sie können diesen Code hier sehen: http://www.opensource.apple.com/source/ntp/ntp-70/ntpd/ntp_loopfilter.c (ab NTP-Version 4.2.6).
Der Taktschleifenfilter wird ziemlich oft ausgeführt - er wird jedes Mal ausgeführt, wenn ntpd seine Upstream-Server abfragt. Standardmäßig sind dies alle 17 Minuten oder mehr. Das relevante Bit des Taktschleifenfilters ist:
if (sys_leap == LEAP_ADDSECOND)
ntv.status |= STA_INS;
Und dann:
ntp_adjtime(&ntv)
Mit anderen Worten, an Tagen, an denen es eine Schaltsekunde gibt, setzt ntpd das "STA_INS" -Flag und ruft adjtimex (2) auf (über seinen Portabilitäts-Wrapper).
Dieser Systemaufruf gelangt zum Kernel. Hier ist der relevante Kernel-Code: https://github.com/mirrors/linux/blob/a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33/kernel/time/ntp.c
Der Kernel-Codepfad sieht ungefähr so aus:
- Zeile 663 - Start der Routine do_adjtimex.
- Zeile 691 - annulliert einen existierenden Schaltsekunden-Timer.
- Zeile 709 - Nimm den Spinlock ntp_lock (diese Sperre ist am möglichen Absturz von livelock beteiligt)
- Zeile 724 - process_adjtimex_modes aufrufen.
- Zeile 616 - process_adj_status aufrufen.
- Zeile 590 - globale Variable time_status setzen, basierend auf Flags, die im adjtimex (2) -Aufruf gesetzt wurden
- Zeile 592 - Überprüfen Sie die globale Variable time_state. Rufen Sie in den meisten Fällen ntp_start_leap_timer auf.
- Zeile 554 - Überprüfen Sie die globale Variable time_status. STA_INS wird gesetzt, setzen Sie also time_state auf TIME_INS und rufen Sie hrtimer_start (eine andere Kernelfunktion) auf, um den Schaltsekunden-Timer zu starten. Während der Erstellung eines Timers wird mit diesem Code die xtime_lock erfasst. Wenn dies passiert, während eine andere CPU bereits den xtime_lock und den ntp_lock gepackt hat, wird der Kernel gesperrt. Aus diesem Grund hat John Stultz den Patch geschrieben, um die Verwendung von Hrtimern zu vermeiden. Das hat heute allen Ärger bereitet.
- Zeile 598 - Wenn ntp_start_leap_timer keinen Sprungtimer gestartet hat, setzen Sie time_state auf TIME_OK
- Zeile 751 - Unter der Annahme, dass der Kernel nicht gesperrt ist, wird der Stack aufgelöst und der Spinlock ntp_lock freigegeben.
Hier gibt es ein paar interessante Dinge.
Zuerst löscht die Leitung 691 den vorhandenen Zeitgeber bei jedem Aufruf von adjtimex (2). Dann erstellt 554 diesen Zeitgeber neu. Dies bedeutet, dass jedes Mal, wenn ntpd seinen Clock-Loop-Filter ausführt, der Buggy-Code aufgerufen wurde.
Daher glaube ich, dass Red Hat falsch lag, als sie sagten, dass das System nicht abstürzen würde, wenn ntpd das Schaltsekunden-Flag gesetzt hätte. Ich glaube, dass jedes System, auf dem ntpd ausgeführt wird, das Potenzial hatte, alle 17 Minuten (oder länger) für den Zeitraum von 24 Stunden vor der Schaltsekunde zu blockieren. Ich glaube, das könnte auch erklären, warum so viele Systeme abgestürzt sind. Eine einmalige Crash-Chance würde viel seltener getroffen als drei Chancen pro Stunde.
UPDATE: In der KB-Lösung von Red Hat unter https://access.redhat.com/knowledge/solutions/154713 kamen die Red Hat-Ingenieure zu dem gleichen Schluss (dass das Ausführen von ntpd den Buggy-Code ständig beeinträchtigen würde). Und tatsächlich taten sie dies einige Stunden vor mir. Diese Lösung war nicht mit dem Hauptartikel unter https://access.redhat.com/knowledge/articles/15145 verknüpft , daher habe ich sie bis jetzt nicht bemerkt.
Zweitens erklärt dies, warum geladene Systeme häufiger abstürzen. Auf geladenen Systemen werden mehr Interrupts verarbeitet, wodurch die Kernelfunktion "do_tick" häufiger aufgerufen wird, sodass dieser Code häufiger ausgeführt und der Befehl ntp_lock abgerufen werden kann, während der Zeitgeber erstellt wurde.
Drittens: Kann das System abstürzen, wenn die Schaltsekunde tatsächlich eintritt? Ich weiß es nicht genau, aber möglicherweise auch, weil der Timer, der die Schaltsekundenanpassung auslöst und tatsächlich ausführt (ntp_leap_second, Zeile 388), auch den Spinlock ntp_lock erfasst und hrtimer_add_expires_ns aufruft. Ich weiß nicht, ob dieser Anruf möglicherweise auch eine Lebenssperre auslösen kann, aber es scheint nicht unmöglich zu sein.
Was bewirkt schließlich, dass das Schaltsekunden-Flag deaktiviert wird, nachdem die Schaltsekunde abgelaufen ist? Die Antwort ist, dass ntpd das Setzen des Schaltsekunden-Flags nach Mitternacht stoppt, wenn es adjtimex (2) aufruft. Da das Flag nicht gesetzt ist, ist die Prüfung in Zeile 554 nicht wahr, und es wird kein Zeitgeber erstellt, und Zeile 598 setzt die globale Variable time_state auf TIME_OK zurück. Dies erklärt, warum, wenn Sie das Flag mit adjtimex (8) direkt nach der Schaltsekunde markieren, das Schaltsekunden-Flag immer noch gesetzt ist.
Kurz gesagt, der beste Rat für heute scheint der erste zu sein, den ich immerhin gegeben habe: Deaktiviere ntpd und deaktiviere das Schaltsekunden-Flag.
Und noch ein paar abschließende Gedanken:
- Keiner der Linux-Anbieter bemerkte John Stultz 'Patch und wendete ihn auf ihre Kernel an :(
- Warum hat John Stultz nicht einige der Anbieter alarmiert, die dies benötigten? Vielleicht schien die Chance, dass das Livelock Lärm machte, gering genug zu sein, nicht gerechtfertigt.
- Ich habe gehört, dass Java-Prozesse abstürzen oder sich drehen, als die Schaltsekunde angewendet wurde. Vielleicht sollten wir dem Beispiel von Google folgen und überdenken, wie wir Schaltsekunden auf unsere Systeme anwenden: http://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html
06/02 Update von John Stultz:
https://lkml.org/lkml/2012/7/1/203
Der Beitrag enthielt eine schrittweise Anleitung, warum die Schaltsekunde dazu führte, dass die Futex-Timer vorzeitig und kontinuierlich abliefen und die CPU-Last anstieg.