Bestimmen der spezifischen Datei, die für hohe E / A verantwortlich ist

37

Dies ist ein einfaches Problem, aber das erste Mal, dass ich es tatsächlich beheben musste: Ermitteln, welche spezifischen Dateien / Inodes die Ziele der meisten E / A sind. Ich möchte mir einen allgemeinen Systemüberblick verschaffen können, aber wenn ich eine PID oder TID angeben muss, bin ich damit einverstanden.

Ich würde gerne auf ein straceProgramm verzichten müssen, das auftaucht iotop. Verwenden Sie vorzugsweise ein Werkzeug in der gleichen Art wie iotopdas, das nach Datei sortiert ist. Ich kann verwenden, um lsofzu sehen, welche Dateien Mailman geöffnet hat, aber es gibt nicht an, welche Datei E / A empfängt oder wie viel.

Ich habe an einer anderen Stelle gesehen, wo dies vorgeschlagen wurde, auditdaber ich würde es vorziehen, dies nicht zu tun, da dadurch die Informationen in unsere Audit-Dateien aufgenommen werden, die wir für andere Zwecke verwenden, und dies scheint ein Problem zu sein, das ich untersuchen sollte auf diese Weise.

Das spezifische Problem, das ich gerade habe, ist, dass LVM-Snapshots zu schnell erstellt werden. Ich habe das Problem seitdem behoben, hätte es aber gerne auf diese Weise behoben, anstatt nur lsalle geöffneten Dateideskriptoren zu überprüfen, /proc/<pid>/fdum festzustellen, welche am schnellsten wächst.

Bratchley
quelle
möglicherweise verbunden: unix.stackexchange.com/questions/9520/…
slm
Ja, das hatte ich vorher noch nicht gesehen, aber die meisten Antworten auf diese Frage lauteten im Grunde genommen so: "Nun, wenn Sie Dinge auf diese unglaublich spezifische Weise tun und etwas Seltsames tun, können Sie eine grobe Idee haben", verglichen mit etwas, das sich direkt löst das problem ohne dass der admin zu ausgefallen wird. Ich habe nicht vor, andere zu kritisieren, und mir ist jetzt klar, dass die Schwierigkeit dieses Problems wahrscheinlich darin besteht, wie solche Lösungen angeboten wurden, aber es scheint, als ob selbst wenn es kein Tool gibt fatrace, das älter ist, so etwas wie das Skript, das ich geschrieben habe, das sollte wurden angeboten, da es allgemeiner verwendbar ist.
Bratchley
Um es klar zu sagen: Ich kritisiere nicht die anderen, die Hilfe angeboten haben. Hilfe ist immer besser als keine Hilfe. Es ist nur frustrierend, wenn Sie der Meinung sind, dass das Problem eine direkte Antwort haben sollte und Sie sich nur selbst ein Bild machen können oder wenn andere vorschlagen, es handele sich entweder um blöde Problemumgehungen oder um sehr manuelle Prozesse (wie das, was ich letztendlich mit meinem Mailman-Problem gemacht habe).
Bratchley
Ja, ich bin immer wieder erstaunt, wenn ich hier auf der Website Antworten auf neue Fragen finde, die erst auftauchen, wenn ich eine Weile grabe. Scheint, als wäre dort etwas kaputt 8-). Daher ist es gut, dasselbe Q auf mehrere Arten zu fragen und es mit den älteren zu verknüpfen, wenn sie herausgeführt werden. Obwohl Ihr Skript ein besserer Ansatz ist, bin ich dennoch überrascht, dass es kein Allzweck-Tool gibt, das das tut, was Sie verlangen. Scheint eine große Lücke in Unix.
SLM
Der größte Teil der Hilfe ist nur äußerst zielgerichtet, was etwas ärgerlich sein kann, da Sie bei der Beantwortung häufig dasselbe auf unterschiedliche Weise sagen. Aber das ist die Natur der SE-Sites. Ich weiß nicht, wie Gilles das macht. Ich mag diese längeren Fragen und Antworten besser.
SLM

Antworten:

59

Es gibt einige Aspekte dieser Frage, die teilweise durch andere Tools behoben wurden, aber anscheinend gibt es kein einziges Tool, das alle Funktionen bietet, die Sie suchen.

iotop

Dieses Tool zeigt, welche Prozesse die meisten E / A verbrauchen. Es fehlen jedoch Optionen, um bestimmte Dateinamen anzuzeigen.

$ sudo iotop
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                        
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/u:0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]

Standardmäßig wird das Gleiche topwie bei regulären Prozessen für die CPU-Zeit getan , mit Ausnahme der Datenträger-E / A. Sie können ihn überreden, eine 30.000-Fuß-Ansicht zu erhalten, indem Sie den -aSchalter verwenden, sodass er im Laufe der Zeit eine Akkumulation nach Prozessen anzeigt.

$ sudo iotop -a
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                        
  258 be/3 root          0.00 B    896.00 K  0.00 %  0.46 % [jbd2/dm-0-8]
22698 be/4 emma          0.00 B     72.00 K  0.00 %  0.00 % chrome
22712 be/4 emma          0.00 B    172.00 K  0.00 %  0.00 % chrome
 1177 be/4 root          0.00 B     36.00 K  0.00 %  0.00 % cupsd -F
22711 be/4 emma          0.00 B    120.00 K  0.00 %  0.00 % chrome
22703 be/4 emma          0.00 B     32.00 K  0.00 %  0.00 % chrome
22722 be/4 emma          0.00 B     12.00 K  0.00 %  0.00 % chrome

i * tools (inotify, iwatch, etc.)

Diese Tools bieten Zugriff auf die Dateizugriffsereignisse, müssen jedoch speziell auf bestimmte Verzeichnisse oder Dateien ausgerichtet sein. Sie sind daher nicht besonders hilfreich, wenn Sie versuchen, einen nicht autorisierten Dateizugriff durch einen unbekannten Prozess aufzuspüren, wenn Sie Leistungsprobleme debuggen.

Das inotifyFramework enthält auch keine Angaben zu den Dateien, auf die zugegriffen wird. Mit diesen Tools ist nur die Art des Zugriffs verfügbar, sodass keine Informationen über die Datenmenge verfügbar sind, die hin und her verschoben wird.

iostat

Zeigt die Gesamtleistung (Lesen und Schreiben) basierend auf dem Zugriff auf ein bestimmtes Gerät (Festplatte) oder eine Partition an. Es gibt jedoch keinen Einblick, welche Dateien diese Zugriffe generieren.

$ iostat -htx 1 1
Linux 3.5.0-19-generic (manny)  08/18/2013  _x86_64_    (3 CPU)

08/18/2013 10:15:38 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          18.41    0.00    1.98    0.11    0.00   79.49

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda
                  0.01     0.67    0.09    0.87     1.45    16.27    37.06     0.01   10.92   11.86   10.82   5.02   0.48
dm-0
                  0.00     0.00    0.09    1.42     1.42    16.21    23.41     0.01    9.95   12.22    9.81   3.19   0.48
dm-1
                  0.00     0.00    0.00    0.02     0.01     0.06     8.00     0.00  175.77   24.68  204.11   1.43   0.00

blktrace

Diese Option ist zu niedrig. Es fehlt die Übersicht darüber, auf welche Dateien und / oder Inodes zugegriffen wird, lediglich die unformatierten Blocknummern.

$ sudo blktrace -d /dev/sda -o - | blkparse -i -
  8,5    0        1     0.000000000   258  A WBS 0 + 0 <- (252,0) 0
  8,0    0        2     0.000001644   258  Q WBS [(null)]
  8,0    0        3     0.000007636   258  G WBS [(null)]
  8,0    0        4     0.000011344   258  I WBS [(null)]
  8,5    2        1 1266874889.709032673   258  A  WS 852117920 + 8 <- (252,0) 852115872
  8,0    2        2 1266874889.709033751   258  A  WS 852619680 + 8 <- (8,5) 852117920
  8,0    2        3 1266874889.709034966   258  Q  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        4 1266874889.709043188   258  G  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        5 1266874889.709045444   258  P   N [jbd2/dm-0-8]
  8,0    2        6 1266874889.709051409   258  I  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        7 1266874889.709053080   258  U   N [jbd2/dm-0-8] 1
  8,0    2        8 1266874889.709056385   258  D  WS 852619680 + 8 [jbd2/dm-0-8]
  8,5    2        9 1266874889.709111456   258  A  WS 482763752 + 8 <- (252,0) 482761704
...
^C
...
Total (8,0):
 Reads Queued:           0,        0KiB  Writes Queued:           7,       24KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:        3,       24KiB
 Reads Requeued:         0       Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:        5,       24KiB
 Read Merges:            0,        0KiB  Write Merges:            3,       12KiB
 IO unplugs:             2           Timer unplugs:           0

Throughput (R/W): 0KiB/s / 510KiB/s
Events (8,0): 43 entries
Skips: 0 forward (0 -   0.0%)

Fatrace

Dies ist eine Neuerung im Linux-Kernel und eine willkommene Neuerung, daher nur in neueren Distributionen wie Ubuntu 12.10. Bei meinem Fedora 14-System fehlte es 8-).

Es bietet den gleichen Zugriff, den Sie erhalten können, inotifyohne auf ein bestimmtes Verzeichnis und / oder bestimmte Dateien abzielen zu müssen.

$ sudo fatrace
pickup(4910): O /var/spool/postfix/maildrop
pickup(4910): C /var/spool/postfix/maildrop
sshd(4927): CO /etc/group
sshd(4927): CO /etc/passwd
sshd(4927): RCO /var/log/lastlog
sshd(4927): CWO /var/log/wtmp
sshd(4927): CWO /var/log/lastlog
sshd(6808): RO /bin/dash
sshd(6808): RO /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): R /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): O /etc/ld.so.cache
sh(6808): O /lib/x86_64-linux-gnu/libc-2.15.so

Das Obige zeigt Ihnen die Prozess-ID, die den Dateizugriff ausführt, und die Datei, auf die zugegriffen wird, aber es gibt Ihnen keine allgemeine Bandbreitennutzung, sodass jeder Zugriff von keinem anderen Zugriff unterschieden werden kann.

Also, was ist zu tun?

Die fatraceOption ist für die ENDLICHE Bereitstellung eines Tools am vielversprechendsten, mit dem Sie die Gesamtnutzung der Datenträger-E / A anhand der Dateien anzeigen können, auf die zugegriffen wird, anstatt anhand der Prozesse, auf die zugegriffen wird.

Verweise

slm
quelle
6
Süßes Jesuskind, slm. Sie sind für mich wie der Rockstar der Unix SE. Ihre Antworten sind immer unglaublich lehrreich und zeigen viel Recherche an einem Ort. Die meisten Leute (wenn sie davon gewusst hätten) hätten soeben das letzte Stück darüber gepostet fatraceund nicht entwickelt, dass es viel passiert ist. Ich weiß es wirklich zu schätzen, wie Sie die Extrameile gehen, um sicherzustellen, dass die Leute das vollständige Bild verstehen, und ich wünschte, ich könnte mehr tun, als nur zu voten und Kopfgeld zu geben.
Bratchley
@JoelDavis - danke für deine freundlichen Worte. Ich mochte Ihre Idee, eine kanonische Antwort zu geben, deshalb habe ich versucht, das hier zu beginnen. Ich bin auch oft auf dieses Problem gestoßen und wünschte, ich hätte eine Ressource wie diese, also dachte ich, wir würden sie hier erstellen. 8-).
SLM
Eine Sache, die mich verwirrt: Als ich die Installation yumdurchführte, wurden aus irgendeinem Grund die Bibliotheken von python3 geladen. Ich habe einen filedrauf gemacht und es sieht so aus, als wäre es eine ELF-ausführbare Datei. lddzeigt keine Links zu pythonund hat es auch nicht getan strings. Irgendeine Idee, warum es mit Python3 zu tun hatte?
Bratchley
1
Übrigens muss ich anscheinend einige Zeit warten, nachdem ich die Antwort auf die Prämienprämie akzeptiert habe. Nicht, dass es jemandem etwas ausmacht, der ungefähr die Hälfte der gesamten Reputationspunkte der Unix SE besitzt, sondern nur eine ungefähre Angabe.
Bratchley
1
Für mich kein wirkliches Problem, nein. Ich kann die Informationen, die ich dazu benötige, über die entsprechenden iotopund iostatAnrufe erhalten. Auch ich die Python Sache herausgefunden , es sieht aus wie (auf Fedora 18 zumindest) gibt es einen „Power-usage-Bericht“ pythonSkript so yumwurde nur auf die Tatsache reagieren , die pythonin dem RPMs Abhängigkeiten ist. Damit ist dieses spezielle Rätsel gelöst.
Bratchley
4

Ich habe noch keine Antwort bekommen, aber ich habe dieses Skript (am Ende) geschrieben und es scheint zu tun, was ich will. Ich habe es nicht auf anderen Systemen getestet und es ist Linux-spezifisch.

Grundsätzlich stracedauert es nur 30 Sekunden, filtert nach dateibezogenen Systemaufrufen und versucht, den Dateinamen zu entfernen. Es zählt die Anzahl der Vorkommen dieser Datei in straceund präsentiert dem Benutzer eine paginierte Zusammenfassung. Es ist nicht perfekt, aber die Anzahl der Systemaufrufe für eine bestimmte Datei hat möglicherweise eine schwache Korrelation mit der Leistung der E / A.

Ich habe es noch nicht vollständig getestet, aber wenn es nicht sofort funktioniert, sollte es den Leuten einen Ausgangspunkt bieten. Wenn es weiter ausgearbeitet wird, kann es ratsam sein, dies in eine höhere Sprache wie Python umzuschreiben .

Wenn ich innerhalb einer Woche keine Antwort auf diese Frage bekomme (auch wenn es sich um ein anderes Tool handelt, das nur die E / A eines bestimmten Prozesses zählt), akzeptiere ich dies als meine Antwort für die Nachwelt.

Skript:

#!/bin/bash

####
# Creates files underneath /tmp
# Requires commands: timeout  strace  stty
####
#
# All commands are GNU unless otherwise stated
#
##########################################################


####
## Initialization
####

outputFile=/tmp/out.$RANDOM.$$
uniqueLinesFile=/tmp/unique.$RANDOM.$$
finalResults=/tmp/finalOutput.txt.$$

if [ $# -ne 1 ]; then
    echo "USAGE: traceIO [PID]" >&2
    exit 2
fi

if ! [[ "$1" =~ ^[0-9]+$ ]]; then
    echo "USAGE: traceIO [PID]" >&2
    echo -e "\nGiven Process ID is not a number." >&2
    exit 2
fi

if [ ! -e /proc/$1 ]; then
    echo "USAGE: traceIO [PID]" >&2
    echo -e "\nThere is no process with $1 as the PID." >&2
    exit 2
fi

if [[ "x$PAGER" == "x" ]]; then

   for currentNeedle in less more cat; do

      which $currentNeedle >/dev/null 2>&1

      if [ $? -eq 0 ]; then
         PAGER=$currentNeedle
         break;
      fi

   done

  if [[ "x$PAGER" == "x" ]]; then

     echo "Please set \$PAGER appropriately and re-run" >&2
     exit 1

  fi

fi

####
## Tracing
####

echo "Tracing command for 30 seconds..."

timeout 30 strace -e trace=file -fvv -p $1 2>&1 | egrep -v -e "detached$" -e "interrupt to quit$" | cut -f2 -d \" > $outputFile

if [ $? -ne 0 ]; then
   echo -e "\nError performing Trace. Exiting"
   rm -f $outputFile 2>/dev/null
   exit 1
fi

echo "Trace complete. Preparing Results..."

####
## Processing
####

sort $outputFile | uniq > $uniqueLinesFile

echo -e "\n--------  RESULTS --------\n\n  #\t Path " > $finalResults
echo -e " ---\t-------" >> $finalResults

while IFS= read -r currentLine; do

   echo -n $(grep -c "$currentLine" "$outputFile")
   echo -e "\t$currentLine"

done < "$uniqueLinesFile" | sort -rn >> $finalResults

####
## Presentation
####

resultSize=$(wc -l $finalResults | awk '{print $1}')
currentWindowSize=$(stty size | awk '{print $1}')

  # We put five literal lines in the file so if we don't have more than that, there were no results
if [ $resultSize -eq 5 ]; then

   echo -e "\n\n No Results found!"

elif [ $resultSize -ge $currentWindowSize ] ; then

   $PAGER $finalResults

else

   cat $finalResults

fi

  # Cleanup
rm -f $uniqueLinesFile $outputFile $finalResults
Bratchley
quelle
2

Sie können iWatch mit iWatch verwenden

iWatch ist sehr einfach zu bedienen. Nehmen wir an, Sie möchten die Änderungen im / etc-Dateisystem beobachten und müssen sie nur in der Konsole ausführen

$ iwatch /etc

und iwatch teilt Ihnen mit, ob sich in diesem Verzeichnis etwas ändert. Und wenn Sie per E-Mail benachrichtigt werden möchten:

$ iwatch -m [email protected] /etc

In diesem Fall erhält der Administrator eine E-Mail-Benachrichtigung (möglicherweise können Sie Ihr SMS-Gateway-Konto verwenden, sodass Sie jederzeit und überall sofort alarmiert werden). Und wenn Sie viele unterschiedliche Verzeichnisse überwachen möchten, können Sie eine Konfigurationsdatei verwenden. Diese Konfigurationsdatei ist eine XML-Datei mit einer leicht verständlichen Struktur.

vfbsilva
quelle
1
Ich nehme an, das ist inotifyrichtig? Ich habe gezögert, irgendetwas basierend auf zu verwenden, inotifyda Sie ihm Pfade geben müssen (was im Wesentlichen das ist, wonach ich suche), und ich war besorgt darüber, wie viel Overhead es geben würde, wenn ich einfach alles darunter mache. /Kann dieser Filter nach PID? Ich könnte vorübergehende Langsamkeit tolerieren, wenn es einfach genug ist, herauszufinden, welches Programm dies tut. Die Website hat auch keine Beispielbefehlsausgabe.
Bratchley
1
@ JoelDavis Ich bin wirklich nicht sicher. Soweit ich weiß, verbraucht es sehr viel RAM, daher ist es gefährlich, es unter "/" laufen zu lassen.
VFBSILVA