Debuggen der Linux-E / A-Latenz

13

Ich habe einige E / A-Probleme auf einigen von mir verwalteten Linux-Systemen. Sie manifestieren sich darin, dass Prozesse in einfachen Systemaufrufen wie open (), unlink () oder close () für einige Sekunden blockieren (was ein Problem darstellt, da einige der beteiligten Programme eine relativ geringe E / A-Latenz benötigen, um zu funktionieren richtig). Es ist wahr, dass die fraglichen Systeme eine moderate E / A-Belastung erfahren, aber ich kann kaum glauben, dass es ausreichen würde, um solch enorme Latenzzeiten zu rechtfertigen. Manchmal können die Anrufe länger als 15 Sekunden dauern (obwohl sie häufiger 1 oder 2 oder 3 Sekunden dauern).

Meine Frage ist: Wie kann ich herausfinden, warum dies passiert? Was ich möchte, ist ein Tool, das mir sagen könnte, von welchen Prozessen im Kernel die fraglichen blockiert werden und warum das, worauf sie sich befinden, beschäftigt ist, was damit passiert und solche Dinge. Gibt es ein solches Tool, oder gibt es eine andere Möglichkeit, zu debuggen, was passiert?

Alternativ kann natürlich, wenn Sie irgendeine Ahnung haben , was tatsächlich ist passiert, wie kann es vermieden werden?

Das Dateisystem, das ich verwende, ist XFS.

Dolda2000
quelle

Antworten:

14

Jetzt, zu gegebener Zeit, habe ich es geschafft, dies selbst zu lösen, so dass ich es zumindest für die Nachwelt selbst nachverfolgen kann.

Leider habe ich das ursprüngliche Problem bei einem Kernel-Upgrade verloren, habe aber stattdessen ein neues Problem erhalten, das noch leistungsschwächer und genauso schwer aufzuspüren ist. Die Techniken, die ich fand, waren die folgenden:

Zuallererst ist blktrace/ blkparseein Tool, das ich sehr hilfreich fand. Es ermöglicht die Verfolgung des Fortschritts einzelner E / A-Anforderungen mit vielen hilfreichen Details, z. B. dem Prozess, der die Anforderung gesendet hat. Es ist hilfreich, die Ausgabe zu aktivieren tmpfs, damit die Verarbeitung des Trace-Speichers nicht von selbst beginnt.

Das hat aber nur insofern geholfen, als ich einen Kernel mit mehr Debugging-Funktionalität kompiliert habe. Insbesondere fand ich es ftracesehr hilfreich, da ich den Prozess mit der schlechten Leistung im Kernel-Space nachverfolgen konnte, um zu sehen, was er tat und wo er blockierte. Das Kompilieren eines Debug-Kernels bietet auch eine funktionierende WCHANAusgabe ps, mit der sich leichter feststellen lässt, was ein Prozess im Kernel tut, zumindest in einfacheren Fällen.

Ich hatte auch gehofft, dass LatencyTop nützlich ist, aber ich fand es ziemlich fehlerhaft und auch, dass nur Latenzgründe angezeigt wurden, die zu "hoch" waren, um wirklich nützlich zu sein.

Ich fand es auch hilfreicher iostat, einfach den Inhalt von /sys/block/$DEVICE/statin sehr kurzen Abständen zu betrachten, einfach so:

while :; do cat /sys/block/sda/stat; sleep .1; done

Documentation/iostats.txtInformationen zum Format der statDatei finden Sie im Kernel-Quelltext . Wenn ich es in kurzen Abständen betrachtete, konnte ich das genaue Timing und die Größe von E / A-Bursts und dergleichen feststellen.

Am Ende stellte ich fest, dass das Problem, das ich nach dem Kernel-Upgrade hatte, durch stabile Seiten verursacht wurde , eine Funktion, die in Linux 3.0 eingeführt wurde. In meinem Fall wurde Berkeley DB für längere Zeit angehalten, wenn Seiten in ihrer mmap'ed verschmutzt wurden Regionsdateien. Es scheint zwar möglich zu sein, dieses Feature zu patchen, und die Probleme, die es verursacht, könnten auch in Linux 3.9 behoben sein. Das schlimmste Problem, das ich bisher hatte, habe ich jedoch durch Patchen von Berkeley DB behoben , damit ich die Regionsdateien in einem anderen Verzeichnis ablegen kann (in meinem Fall /dev/shm), so dass ich das Problem insgesamt vermeiden kann.

Dolda2000
quelle
3

Meiner Erfahrung nach ist http://freecode.com/projects/sysstat aka das einfachste und detaillierteste Statistik-Tool, das Sie zur Verfolgung mysteriöser Systemleistungsprobleme installieren können . sar

Natürlich möchten Sie auch die Ausgabe des iostat-Befehls betrachten, insbesondere, wie viel% iowait unter normaler Systemlast (unter 1,0 oder so) unter 5 bis 10% liegen sollte.

Sehen Sie sich die Ausgabe von ps an, wenn in der Spalte STAT der Status D angezeigt wird, der bedeutet, dass diese Prozesse gesperrt sind und auf E / A warten. Dies ist höchstwahrscheinlich ein Hardwareproblem mit dem Controller oder der Festplatte. Überprüfen Sie die SMART-Statistiken sowie dmesg und syslog auf Hinweise

Überprüfen Sie das Sar-Protokoll und identifizieren Sie Spitzenzeiten, falls dies jemals passiert, und versuchen Sie, diese Zeiten mit datenträgerintensiven Cron-Jobs abzugleichen, z. B. Backups über das Netzwerk

Sie können Ihre Festplattenleistung mit bonnie ++ messen

Feczo
quelle
3

Ich dachte, ich würde Strace erwähnen, obwohl diese Frage jetzt Monate alt ist. Es kann jemandem mit einem ähnlichen Problem helfen, der diese Seite findet.

Versuchen.

strace "application"

Sie können auch tun

strace -e read,write "application"

um nur Lese- / Schreibereignisse anzuzeigen.

Die Anwendung wird wie gewohnt geladen (wenn auch etwas langsamer), und Sie können sie wie gewohnt verwenden, um das Problem auszulösen. Die Ausgabe erscheint in der Shell, mit der Sie strace gestartet haben.

Das Gute an strace ist, dass Sie den letzten Funktions- / Kernel-Aufruf zu dem Zeitpunkt sehen können, an dem die Anwendung die Verlangsamung auslöst. Wenn sich Ihre /homeKonten in NFS befinden, kann es sein, dass die Anwendung aus irgendeinem Grund Probleme mit der Datei-E / A über NFS hat.

Smar
quelle