Frage Was bedeutet "Die IO-Operation bei logischer Blockadresse # für Disk # wurde erneut versucht" bedeutet, wenn sie im Windows Server-System-Ereignisprotokoll angezeigt wird?


Ich habe einen Multipath IO-konfigurierten Server 2012-Blade, der beim MPIO-Pfadfehler folgende Warnungen anzeigt:

Die IO-Operation an der logischen Blockadresse 0 für die Festplatte 7 wurde erneut versucht.

Ich weiß, was die Warnung verursacht, also suche ich nicht nach der Ursache, aber was bedeutet diese Nachricht eigentlich?

Bedeutet dies, dass, wenn diese IO eine Schreiboperation war, der Server tatsächlich Daten verloren hat, die er schreiben wollte?

Vielen Dank für jedes Licht, das Sie über die Bedeutung dieser Warnmeldung erfahren können.


20
2018-04-14 17:48


Ursprung




Antworten:


Nein, das bedeutet nicht, dass die Daten verloren gegangen sind. Es bedeutet lediglich, dass das IRP (IO-Request-Paket) abgelaufen ist, während das IO-System darauf gewartet hat, dass es abgeschlossen wurde, und so wurde es erneut versucht. Wenn ein Thread eine E / A-Operation beginnt, erstellt der E / A-Manager eine IRP, um die Operation beim Durchlaufen des Systems darzustellen.

Das IRP wird in seinem Anfangszustand in einer Puffer- / Look-Aside-Liste gespeichert, so dass es erneut versucht werden kann, wenn es das erste Mal fehlschlägt. Dies bietet die Atomarität, die man von jedem Transaktionssystem erwarten würde, so dass wir sicherer sein können, dass Sie nicht eine Menge beschädigter oder unvollständiger Daten auf Ihre Festplatte geschrieben bekommen.

Dieses Ereignis macht im Falle eines MPIO-Fehlers Sinn. Angenommen, Windows liest oder schreibt etwas aus dem SAN-Speicher. Die Anfrage wird gesendet, und gleichzeitig schneide ich eines der Kabel zum SAN. Diese Anforderung wird nie abgeschlossen, und Windows wird die Anforderung erneut versuchen, nur diesmal wird die Anforderung dem anderen Pfad folgen.

Diese Ereignisse treten auch auf, wenn die Festplatten überlastet oder nur sehr langsam sind. Sie stellen möglicherweise fest, dass diese Nachrichten mit geplanten Sicherungen usw. übereinstimmen. Die Festplatte ist möglicherweise langsam und beschäftigt, und einige zufällige IRPs haben ein Zeitlimit überschritten und mussten es erneut versuchen. Das IRP könnte in einer Interrupt-Service-Routine oder einem verzögerten Prozedur-Aufruf oder was auch immer stecken bleiben.

Ich konnte sehen, dass viele IO-Filter-Treiber in Ihrem Stack enthalten sind, was dieses Problem zusätzlich verschärft.

Es ist nicht so, dass dieses Verhalten in früheren Versionen von Windows nicht einfach so vorkam, sondern es ist nur so, dass Microsoft anscheinend beschlossen hat, diese Ereignisse in Win8 / Server 2012 zu behandeln.

Bearbeiten: Sie können die herausragenden IRPs eines Threads mit einem Kernel-Debugger finden: kd> !irp 1a2b3c4d, wo Sie diese Adresse zuvor durch Ausgeben des Befehls gefunden haben kd> !process 8f7d6c4a Hier werden alle IRPs aufgelistet, die den Threads zugeordnet sind, die diesem Prozess zugeordnet sind. kd> !process 0 0 um alle laufenden Prozesse aufzulisten.

Sobald Sie die Informationen zu einem IRP mit dem Befehl! Irp aufgelistet haben, können Sie leicht erkennen, welcher Treiber das IRP zuletzt bearbeitet hat, da es einen > in der Liste darauf zeigen. Um weitere Informationen darüber zu erhalten, was dieser Treiber mit diesem IRP gemacht hat, machen Sie einen kd> !devobj 1a2b3c4d5e6f wo das ist die tatsächliche Adresse des Geräteobjekts.

Dann mach a kd> dt 0x1a2b3c3c2b1a _CLASS_PRIVATE_FDO_DATA Verwenden Sie die Adresse der PrivateFdoData-Struktur, die Sie erhalten haben.

Jetzt können Sie die AllTransferPacketsList-Datenstruktur, die Sie von PrivateFdoData erhalten haben, ablegen.

Die Idee ist, dass Sie herausfinden, welcher Fahrer was mit dem IRP gemacht hat, als es das letzte Mal gesehen wurde. Wenn der IRP zu lange inaktiv ist, wird das Zeitlimit überschritten und es wird von Anfang an erneut versucht. Dies kann durch so viele Dinge verursacht werden ... sogar durch einen kosmischen Strahl. Aber die wichtige Sache ist, dass die Transaktion von Anfang an wiederholt wird, und sie wird nicht als abgeschlossen betrachtet, bis der IO-Manager dies sagt.

Oh, und es gibt auch thread-agnostic IO, das ist ein vollständig verschiedene Dosen Würmer. :)

Für weitere Informationen zu diesem Thema, I höchst empfehle Kapitel 8, I / O-System von Windows Internals 6. Ausgabe, von Mark Russinovich, Margosis, et al.

** Edit: ** Ich habe endlich die offizielle KB für diesen Fehler gefunden: http://support.microsoft.com/kb/2819485/EN-US

Der E / A-Vorgang sollte 8 mal wiederholt werden, einmal pro Minute, bis Windows aufgibt.

Bearbeiten: Wie versprochen: http://blogs.msdn.com/b/ntdebugging/archive/2013/04/30/interpreting-event-153-errors.aspx


26
2018-04-14 19:30



Danke Ryan, ich hatte gehofft, dass dies bedeutete, dass die Anfrage zurückgezogen wurde, aber die Daten nicht verloren gingen und eine weitere Anfrage erstellt wurde, um zu versuchen, die Daten erneut zu schreiben. Können Sie auf eine der Quellen für Ihre Antwort verweisen (Bücher, Artikel, eine Notiz, die darauf hinweist, dass Sie Zugriff auf den Windows-Quellcode haben, weil Sie ein großer EA-Kunde sind und einen Debug-Trace durchgeführt haben, um diese Informationen zu finden?)? Ich würde das gerne weiter verstehen. - Chris Magnuson
Redigiert meinen Beitrag, um Ihre Follow-up-Fragen zu beantworten. Die Chancen stehen gut, dass ich später weitere Informationen hinzufügen werde. - Ryan Ries
Jeder, der zum Windows-Debugger wechseln kann, um seinen Punkt zu unterstützen, verdient in meinem Buch einige ernsthafte Anerkennung. Konnte die Antwort nicht noch einmal abstimmen, also muss der Kommentar kommentieren. Ich habe die Windows Internals 6. Ausgabe, Teil 1, und ich bin jetzt dran, Teil 2 mit Kapitel 8 zu kaufen. Vielen Dank - Chris Magnuson
Wie versprochen: blogs.msdn.com/b/ntdebugging/archiv/2013/04/30/... - Ryan Ries


Nein, es würde eine andere Nachricht geben, und (hoffentlich) würde eine der Anwendungsebenen eine Ausnahme auslösen, wenn die Daten nicht erfolgreich gespeichert werden konnten.

Vor Windows Server 2012 (oder Hotfix 2819485 unter Windows Server 2008 R2) versuchte das System automatisch erneut, wenn diese Zeitüberschreitungen auftraten. Der Zweck der Nachricht besteht darin, die Sichtbarkeit dieser Ereignisse zu erhöhen. Sie können auf ein Kapazitätsproblem oder einen Treiberfehler hinweisen, und im Falle von iSCSI können andere Betriebssystemfehler für die Verzögerung verantwortlich sein.

Im Fall von externem (nicht direkt verbundenem) Speicher haben einige Hersteller in der Vergangenheit den Zeitüberschreitungswert beispielsweise auf 60 Sekunden erhöht. Angesichts der Standardanzahl von Wiederholungsversuchen durch höhere Schichtkomponenten wie den iSCSI-Initiator kann dies jedoch bedeuten, dass einige Minuten verstreichen können, bevor das System einen Failover initiiert hat. Das wäre offensichtlich suboptimales Verhalten.

Mehr Informationen:

Registrierungseinträge für SCSI-Miniporttreiber
http://msdn.microsoft.com/en-us/library/windows/hardware/ff563970%28v=vs.85%29.aspx 

https://blogs.msdn.com/b/san/archive/2011/09/01/the-windows-disk-timeout-value-understanding-why-this-should-be-set-to-a-small- Wert.aspx 


Microsoft hat ein Update veröffentlicht, das die Möglichkeit bietet, den Schwellenwert für Storport.sys-Vorgänge anzugeben.

Nachdem Sie dieses Update installiert haben, können Sie ein Ereignis protokollieren, wenn die Latenzzeit für die E / A-Speicherung gleich oder größer als ein Schwellenwert ist. Der Schwellenwert kann vom Benutzer festgelegt werden. Dieser Vorgang wird auf der Ebene des Adaptertreibers ausgeführt, damit Sie feststellen können, ob im SAN ein Leistungsproblem vorliegt. Dann können Sie sich an einen Speicherhersteller wenden, um das Problem zu beheben.

Hinweis: Dieses Update stellt die Funktionalität wieder her, die in Windows 7 und Windows Server 2008 R2 bereitgestellt wurde. Wenn die Funktionalität aktiviert ist, wird der Schwellenwert in 100 Nanosekunden (0,0001 Millisekunden) gemessen. Darüber hinaus werden die folgenden Werte in dem Ereignis protokolliert:

BuildIoDuration: Zeitdauer, die der MINIPORT in der Build-I / O-Funktion für diese Anforderung verbracht hat StartIoDuration: Zeitdauer, die der MINIPORT für diese Anforderung in der Start-I / O-Funktion verbracht hat DataTransferLength: Größe der Übertragung in Bytes

Update, das die Protokollfunktionen des Storport.sys-Treibers in Windows Server 2012 verbessert
http://support.microsoft.com/kb/2819476 

Kumulatives Update für Windows 8 und Windows Server 2012: April 2013
http://support.microsoft.com/kb/2822241 


5
2018-04-14 19:49





Könnte ein später Beitrag sein, aber ich habe festgestellt, dass es mit VSS verursacht werden kann. Wir hatten einen Client, der veeam lief, aber vergessen hatte, den Windows Server zu deaktivieren (der Datenträger wurde entfernt). Es verursachte eine Schuppenlast von Problemen und dieser Fehler war der Hauptgrund.

Stoppte das Backup und wham, keine Fehler.


3
2018-01-03 08:02