IRP_MJ_WRITE Latenz bis zu 15 Sekunden

IRP_MJ_WRITE Latenz bis zu 15 Sekunden

Wir haben eine Anwendung geschrieben, die kleine Schreibvorgänge (22 kB) in mehrere Dateien gleichzeitig ausführt (ein Thread führt im Auftrag anderer Threads asynchrone Schreibvorgänge in die Warteschlange an mehreren Standorten aus) und zwar auf demselben lokalen Datenträger (RAID1).
99,9 % der Schreibvorgänge haben eine geringe Latenz, aber gelegentlich (vielleicht alle ein bis zwei Minuten) kommt es ohne wirkliche Erklärung zu ein oder zwei Schreibvorgängen mit enormer Latenz (ich habe 10 Sekunden und mehr gesehen).

Plattform: Win2003 Server mit NTFS.
Überwachung: Sysinternals Process Monitor (siehe Link unten) und unsere eigene Anwendungsprotokollierung.

Wir haben zur Lösung des Problems verschiedene Dinge ausprobiert, die wir von einigen Websites zusammengetragen haben, z. B.:

  • Den ersten Teil von Dateinamen eindeutig machen, um die Namensgenerierung nach 8.3 zu erleichtern

  • Schreiben von Dateien in mehrere Verzeichnisse

  • Ändern des Intel Disk Write Caching

  • Windows-Datei-/Druckerfreigabe

    • Minimieren Sie den verwendeten Speicher

    • Gleichgewicht

    • Maximieren Sie den Datendurchsatz für die Dateifreigabe

    • Maximieren Sie den Datendurchsatz für Netzwerkanwendungen

  • System->Erweitert->Leistung->Erweitert

  • NtfsDisableLastAccessUpdate – fsutil-Verhalten verwenden, Disablelastaccess 1 festlegen

  • Deaktivieren Sie die 8.3-Namensgenerierung - verwenden Sie „fsutil behavior set disable8dot3 1“ + Neustart

  • Aktivieren Sie einen großen Dateisystem-Cache

  • Paging des Kernelcodes deaktivieren

  • IO-Seitensperrgrenze

  • Deaktivieren (oder Aktivieren) des Indexierungsdiensts

Aber nichts scheint einen großen Unterschied zu machen. Es gibt eine ganze Reihe von Dingen, die wir noch nicht ausprobiert haben, aber wir fragten uns, ob jemand auf dasselbe Problem gestoßen ist, einen Grund und eine Lösung (programmgesteuert oder nicht)?

Wir können das Problem mit IOMeter und einem einfachen Setup reproduzieren:

  1. Starten Sie IOMeter und entfernen Sie mit der Schaltfläche „Trennen“ alle Worker-Threads außer dem ersten in „Topologie“.

  2. Wählen Sie den Worker-Thread aus und setzen Sie auf der Registerkarte „Disk Targets“ ein Kreuz in das Kästchen neben der Festplatte, die Sie verwenden möchten, und geben Sie bei „Maximale Festplattengröße“ „2000000“ ein (HINWEIS: Es muss mindestens 1 GB freier Speicherplatz vorhanden sein; die Sektorgröße beträgt 512 Byte).

  3. Erstellen Sie als Nächstes eine neue Zugriffsspezifikation und fügen Sie sie dem Worker-Thread hinzu:

    • Größe der Übertragungsanforderung = 22 kB

    • 100 % sequentiell

    • Prozent der Zugriffsspezifikation = 100 %

    • Prozent Lesen/Schreiben = 100 % Schreiben

  4. Ändern Sie die Aktualisierungsfrequenz der Ergebnisanzeige auf 5 Sekunden, die Laufzeit des Test-Setups auf 20 Sekunden und beide Einstellungen für „Anzahl der automatisch zu erzeugenden Worker“ auf Null.

  5. Wählen Sie den Worker-Thread im Topologie-Bedienfeld aus und klicken Sie 59-mal auf die Schaltfläche „Worker duplizieren“, um 60 Threads mit identischen Einstellungen zu erstellen.

Klicken Sie auf die Schaltfläche „Los“ (grüne Flagge) und überwachen Sie die Registerkarte „Ergebnisse“. Die „Maximale I/O-Antwortzeit (ms)“ erreicht auf unserem Computer immer mindestens 3500. Unser Computer ist nicht gerade langsam (Xeon 8-Core-Rack-Server mit 4 GB und integriertem RAID).

Mich würde interessieren, was andere Leute bekommen. Wir haben das Gefühl, dass es etwas mit dem NTFS-Dateisystem zu tun haben könnte (unseres ist derzeit zu 75 % mit fragmentierten Dateien gefüllt) und wir werden ein paar Dinge rund um dieses Prinzip ausprobieren. Aber es hängt auch mit der Festplattenleistung zusammen, da wir es auf einer RAMDisk nicht sehen und es auf einem RAID10-Array nicht so schwerwiegend ist.

Für jede Hilfe bin ich sehr dankbar.
Richard

Klicken Sie mit der rechten Maustaste und wählen Sie „Link in neuem Tab öffnen“:
ProcMon-Ergebnis

Antwort1

Ich habe jetzt mehr Informationen zu diesem Thema.

Nachdem ich den beschriebenen IOMeter-Test auf 12 verschiedenen Maschinen mit unterschiedlicher Hardware durchgeführt habe, konnte ich ihn auf einen bestimmten RAID-Chipsatz eingrenzen (3 verschiedene Maschinen mit demselben Chipsatz zeigen dieses Verhalten bei RAID1 und RAID10). Alle anderen Maschinen haben ein um mindestens eine Größenordnung besseres Ergebnis.

Chipsatz: Intel 631xESB/632xESB SATA RAID (auch bekannt als ESB2)

Weitere Informationen und hoffentlich eine Antwort von Intel finden Sie in diesem Beitrag auf der Intel-Site:
Intel 631xESB/632xESB SATA RAID (auch bekannt als ESB2) schreibt langsam

Richard

verwandte Informationen