Linux IO Überwachung pro Datei?


29

Ich interessiere mich für ein Dienstprogramm oder einen Prozess zum Überwachen von Festplatten-E / A pro Datei unter CentOS.

Unter Win2008 ermöglicht das Dienstprogramm resmon diese Art von Drilldown, aber keines der von mir gefundenen Linux-Dienstprogramme (iostat, iotop, dstat, nmon).

Mein Interesse an der Überwachung von E / A-Engpässen auf Datenbankservern. Mit MSSQL habe ich festgestellt, dass es eine informative Diagnose ist, zu wissen, welche Dateien / Dateibereiche am härtesten betroffen sind.



1
Wenn dies möglich ist, beachten Sie, dass die meisten Dateien im PageCache abgelegt sind, sodass Ihre Nummern überall sein können, je nachdem, welche Bytes im PageCache und welche auf der Festplatte vorhanden sind.
Matthew Ife

@Matt Aber mit einer funktionierenden Antwort!
Ewwhite

Antworten:


18

SystemTap ist wahrscheinlich die beste Option.

So sieht die Ausgabe des Beispiels iotime.stp aus:

825946 3364 (NetworkManager) access /sys/class/net/eth0/carrier read: 8190 write: 0
825955 3364 (NetworkManager) iotime /sys/class/net/eth0/carrier time: 9
[...]
117061 2460 (pcscd) access /dev/bus/usb/003/001 read: 43 write: 0
117065 2460 (pcscd) iotime /dev/bus/usb/003/001 time: 7
[...]
3973737 2886 (sendmail) access /proc/loadavg read: 4096 write: 0
3973744 2886 (sendmail) iotime /proc/loadavg time: 11

Der Nachteil (abgesehen von der Lernkurve) ist, dass Sie das Kernel-Debug installieren müssen , was auf einem Produktionssystem möglicherweise nicht möglich ist. Sie können jedoch auf instrumentenübergreifende Methoden zurückgreifen, bei denen Sie ein Modul auf einem Entwicklungssystem kompilieren und diese .ko-Datei auf dem Produktionssystem ausführen .

Wenn Sie ungeduldig sind, lesen Sie Kapitel 4. Nützliche SystemTap-Skripte aus dem Einsteigerhandbuch.


17

SystemTap * -Skript :

#!/usr/bin/env stap
#
# Monitor the I/O of a program.
#
# Usage:
#   ./monitor-io.stp name-of-the-program

global program_name = @1

probe begin {
  printf("%5s %1s %6s %7s %s\n",
         "PID", "D", "BYTES", "us", "FILE")
}

probe vfs.read.return, vfs.write.return {
  # skip other programs
  if (execname() != program_name)
    next

  if (devname=="N/A")
    next

  time_delta = gettimeofday_us() - @entry(gettimeofday_us())
  direction = name == "vfs.read" ? "R" : "W"

  # If you want only the filename, use
  // filename = kernel_string($file->f_path->dentry->d_name->name)
  # If you want only the path from the mountpoint, use
  // filename = devname . "," . reverse_path_walk($file->f_path->dentry)
  # If you want the full path, use
  filename = task_dentry_path(task_current(),
                              $file->f_path->dentry,
                              $file->f_path->mnt)

  printf("%5d %1s %6d %7d %s\n",
         pid(), direction, $return, time_delta, filename)
}

Die Ausgabe sieht folgendermaßen aus:

[root@sl6 ~]# ./monitor-io.stp cat
PID D  BYTES      us FILE
3117 R    224       2 /lib/ld-2.12.so
3117 R    512       3 /lib/libc-2.12.so
3117 R  17989     700 /usr/share/doc/grub-0.97/COPYING
3117 R      0       3 /usr/share/doc/grub-0.97/COPYING

Oder wenn Sie nur den Pfad vom Einhängepunkt anzeigen möchten:

[root@f19 ~]# ./monitor-io.stp cat
  PID D  BYTES      us FILE
26207 R    392       4 vda3,usr/lib64/ld-2.17.so
26207 R    832       3 vda3,usr/lib64/libc-2.17.so
26207 R   1758       4 vda3,etc/passwd
26207 R      0       1 vda3,etc/passwd
26208 R    392       3 vda3,usr/lib64/ld-2.17.so
26208 R    832       3 vda3,usr/lib64/libc-2.17.so
26208 R  35147      16 vdb7,ciupicri/doc/grub2-2.00/COPYING
26208 R      0       2 vdb7,ciupicri/doc/grub2-2.00/COPYING

[root@f19 ~]# mount | grep -E '(vda3|vdb7)'
/dev/vda3 on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/vdb7 on /mnt/mnt1/mnt11/data type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

Einschränkungen / Bugs:

  • mmap- basierte E / A werden nicht angezeigt, da dies der Fall devnameist"N/A"
  • Dateien auf tmpfs werden nicht angezeigt, weil es so devnameist"N/A"
  • Es spielt keine Rolle, ob die Lesevorgänge aus dem Cache stammen oder die Schreibvorgänge in den Puffer

Die Ergebnisse für Matthew Ife 's Programme:

  • für mmaptest privat:

     PID D  BYTES      us FILE
    3140 R    392       5 vda3,usr/lib64/ld-2.17.so
    3140 R    832       5 vda3,usr/lib64/libc-2.17.so
    3140 W     23       9 N/A,3
    3140 W     23       4 N/A,3
    3140 W     17       3 N/A,3
    3140 W     17     118 N/A,3
    3140 W     17     125 N/A,3
    
  • für mmaptest geteilt:

     PID D  BYTES      us FILE
    3168 R    392       3 vda3,usr/lib64/ld-2.17.so
    3168 R    832       3 vda3,usr/lib64/libc-2.17.so
    3168 W     23       7 N/A,3
    3168 W     23       2 N/A,3
    3168 W     17       2 N/A,3
    3168 W     17      98 N/A,3
    
  • für diotest (direkte I / O):

     PID D  BYTES      us FILE
    3178 R    392       2 vda3,usr/lib64/ld-2.17.so
    3178 R    832       3 vda3,usr/lib64/libc-2.17.so
    3178 W     16       6 N/A,3
    3178 W 1048576     509 vda3,var/tmp/test_dio.dat
    3178 R 1048576     244 vda3,var/tmp/test_dio.dat
    3178 W     16      25 N/A,3
    

* Schnellinstallationsanleitung für RHEL 6 oder gleichwertig: yum install systemtapunddebuginfo-install kernel


Das ist ein ziemlich beeindruckender Systemtipp genau dort. Eine hervorragende Demonstration seiner Vielseitigkeit.
Matthew Ife

Misst dies direkte E / A und asynchrone E / A? (mit io_submit, nicht posix)
Matthew Ife

@Mlfe: danke! Als Randnotiz habe ich beim Schreiben des Skripts einen winzigen Fehler in pv und einen in SystemTap ( task_dentry_path) entdeckt :-) Ich habe keine Ahnung von diesem I / O, aber ich kann es testen, wenn Sie mir einen Befehl geben oder ein Beispielprogramm. Zum Beispiel habe ich mit Python mmap getestet. dd iflag=direct oflag=directauftaucht.
Cristian Ciupitu

2
Versuchen Sie dies für mmap: gist.github.com/anonymous/7014284 Ich wette, private Zuordnungen werden nicht gemessen, aber geteilte sind ..
Matthew Ife

2
Hier ist ein direkter IO-Test: gist.github.com/anonymous/7014604
Matthew Ife

9

Sie würden eigentlich dafür verwenden wollen blktrace. Siehe Visualisierung von Linux IO mit Seekwatcher und blktrace .

Ich werde sehen, ob ich bald eines meiner Beispiele posten kann.


Bearbeiten:

Sie erwähnen die Distribution von Linux nicht, aber vielleicht ist dies ein guter Fall für ein Dtrace-Skript unter Linux oder sogar für System Tap , wenn Sie ein RHEL-ähnliches System verwenden.


2
Vielen Dank, gute Sache und sehr nah am Punkt, aber es bietet detaillierte Block-Layer-Informationen, ich brauche etwas, das auf VFS-Abstraktionsschicht funktioniert.
GioMac

Ich fing an, einige systemtap-Skripte zu starten, um dies zum Laufen zu bringen. Ich habe versagt, weil der Server abgestürzt ist. Ich kann diese Informationen über Dtrace unter Solaris erhalten. Ich werde es heute mit Linux versuchen.
Ewwhite

4

Das einzige mir bekannte Tool, das die E / A-Aktivität nach Datei überwachen kann, ist inotifywatch. Es ist Teil des inotify-toolsPakets. Leider gibt es nur die Anzahl der Operationen.


4

Verwenden Sie iotop, um die PIDs von Prozessen abzurufen, die einen hohen IO-Anteil haben

Wenn Sie strace gegen die von Ihnen generierte PID ausführen, werden Sie sehen, auf welche Dateien von einem bestimmten Prozess zugegriffen wird

strace -f -p $PID -e trace=open,read,write

Strace wird Informationen über Systemaufrufe und aufgerufene Dateien bereitstellen, es wird sehr schwierig sein, Statistiken über die Verwendung zu parsen und zu erhalten ...
GioMac

1
Ich dachte, ich würde es versuchen. Es werden VIELE Daten generiert. Und kann den Prozess zum Absturz bringen, wenn Sie Strg + C drücken. Es scheint ziemlich gefährlich zu sein.
Matt


2

Ich würde argumentieren, dass Sie möglicherweise die falsche Frage gestellt haben. Wenn Sie nach I / O-Engpässen suchen, ist es möglicherweise genauso wichtig zu sehen, was auf Ihrer Festplatte passiert. db's sind dafür berüchtigt, zufällige I / O-Vorgänge auszuführen, die den Durchsatz erheblich verringern können, insbesondere wenn Sie nur wenige Spindeln haben.

Interessanter ist möglicherweise, zu prüfen, ob auf den Datenträgern selbst lange Wartezeiten bestehen. Sie können dies mit collectl über den Befehl "collectl -sD" tun, der die Performance-Statistiken der einzelnen Festplatten anzeigt. Are --home, um es in ein top-ähnliches Dienstprogramm zu verwandeln. Wenn viele Festplatten betroffen sind, führen Sie es über colmux aus: colmux -command "-sD" und Sie können nach einer Spalte Ihrer Wahl sortieren, auch über mehrere Systeme hinweg.


Ich bin nicht anderer Meinung als Sie aus Sicht der Festplatte. Ich kann einige Einblicke gewinnen, wenn ein Datenbank-Dateibereich zum Partitionieren von Daten, Indizes, Protokollen usw. verwendet wird, aber auf freigegebenen Datenträgern bereitgestellt wird, wenn die Ressourcen begrenzt sind - beispielsweise auf Entwicklungsservern. Im Idealfall befindet sich jeder dieser Dateibereiche auf einem separaten Volume. Daher ist es angemessen, die E / A aus Sicht der Festplatte zu betrachten. Dies ist wahrscheinlich der Grund, warum alle Überwachungsdienstprogramme festplatten- und nicht dateibasiert sind.
Kermatt

Das ist die richtige Frage. Das Ziel besteht darin, herauszufinden, mit welcher Tabelle diese E / A-Vorgänge ausgeführt werden. In den meisten Datenbanken besteht eine Tabelle aus einer oder mehreren Dateien. Auf jedem Datenträger werden sich viele Dateien befinden. Die Ermittlung der Hotspots ist eine nützliche Eingabe für die Datenbankoptimierung.
Greg Smith

2

Sie können E / A pro Blockgerät (über / proc / diskstats) und pro Prozess (über io accounting /proc/$PID/iooder taskstats ) überwachen , aber ich kenne keine Möglichkeit, dies pro Datei zu tun.


0

Kann sein inotify diese lösen lösen wird.

Die inotify-API bietet einen Mechanismus zum Überwachen von Dateisystemereignissen. Inotify kann zum Überwachen einzelner Dateien oder zum Überwachen von Verzeichnissen verwendet werden. Wenn ein Verzeichnis überwacht wird, gibt inotify Ereignisse für das Verzeichnis selbst und für Dateien innerhalb des Verzeichnisses zurück.

Überwachen Sie die Dateisystemaktivität mit inotify

inotify Referenz


Dies liefert möglicherweise die Aufrufe, die für die Datei ausgeführt wurden, bietet jedoch nur wenige Informationen darüber, welche PID sie ausgeführt hat, wie groß der Schreibvorgang war, wo und wie lange er gedauert hat.
Matthew Ife

Die Frage fragt nicht nach dem Prozess (der möglicherweise auf andere Weise entdeckt werden kann, wie lsof)
Gert van den Berg

0

Obwohl die Antworten hier viele gute Informationen enthalten, frage ich mich, ob sie tatsächlich zutreffen.

Wenn es sich um Dateien im 10-Gigabyte-Bereich handelt, in die ständig geschrieben wird, und wenn es sich nicht um Protokolldateien oder ähnliches handelt, die ständig angehängt werden (in diesem Fall wird nur die Dateigröße überwacht), handelt es sich höchstwahrscheinlich um mmap-Dateien . Wenn dies der Fall ist, ist die beste Antwort möglicherweise, dass Sie aufhören sollten, nach den meisten Lösungen zu suchen. Das erste, was Sie dann von einer anderen vorgeschlagenen Lösung verlangen sollten, ist "Funktioniert es mit mmap?", Da dies meistens nicht der Fall ist. Sie können das Problem jedoch möglicherweise in die Überwachung eines Blockgeräts umwandeln, anstatt eine Datei zu überwachen.

Wenn ein Programm eine Seite aus einer mmap-Datei anfordert, verweist es lediglich auf einen Speicherort im virtuellen Speicher. Diese Seite befindet sich möglicherweise bereits im Speicher oder nicht. Wenn dies nicht der Fall ist, wird ein Seitenfehler generiert, der das Laden der Seite von der Festplatte auslöst. Dies geschieht jedoch innerhalb des virtuellen Speichersystems, das nicht einfach an einen bestimmten Anwendungsprozess oder eine bestimmte Datei gebunden werden kann. Wenn Ihre App eine mmap-Seite aktualisiert, wird abhängig von den Flags möglicherweise kein sofortiger Schreibvorgang auf die Festplatte ausgelöst, und in einigen Fällen wird möglicherweise gar nicht auf die Festplatte geschrieben (obwohl dies vermutlich nicht die letzten Fälle sind, an denen Sie interessiert sind im).

Das Beste, was ich mir für mmap-Dateien vorstellen kann, ist, wenn es für Sie sinnvoll ist, jede der relevanten Dateien auf einem separaten Gerät zu speichern und mithilfe der Gerätestatistik Ihre Nutzungsdaten zu erfassen. Sie könnten dafür lvm-Partitionen verwenden. Ein Bind-Mount funktioniert jedoch nicht, da kein neues Blockgerät erstellt wird.

Sobald Sie Ihre Dateien auf separaten Blockgeräten haben, können Sie Statistiken aus / sys / block / * oder / proc / diskstats abrufen

Es kann zu störend sein, dies auf einem Produktionsserver einzuführen, aber vielleicht können Sie davon Gebrauch machen.

WENN die Dateien nicht gemappt sind, können Sie hier eine der anderen Lösungen auswählen.


Bitte sorgfältig lesen, ich brauche keine Block-Level-Statistiken :)
GioMac

Richtig, aber die Art von Statistiken, nach denen Sie fragen, ist für MMAPED-Dateien nicht möglich. Wenn Sie dagegen vorgehen, können Sie auf diese Weise Statistiken über Dateien abrufen, indem Sie eine Datei pro Gerät verwenden und die Datei lesen Gerätestatistiken.
mc0e

-1

Ich habe vor kurzem mit collectl herumgebastelt , es sieht toll aus und ist ziemlich unkompliziert zu installieren. Das Interessanteste ist, dass Sie herausfinden können, welcher Prozess für E / A-Engpässe verantwortlich ist. Ich würde Ihnen empfehlen, mit Collectl zu lesen , es könnte nützlich sein.


1
collectl überwacht nicht pro Datei, es funktioniert pro Prozess
Greg Smith


-2

Ich denke, dass iotop eines der besten Tools unter Linux ist, um Engpässe bei IO zu identifizieren.


3
-1 iotopüberwacht nicht pro Datei, es funktioniert pro Prozess
dyasny
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.