Linux - Wie kann ich sehen, was auf Disk IO wartet?

42

Ich habe einen Server, der eine sehr hohe Auslastung hat. Was die CPU-Auslastung angeht, geht mir nichts aus dem Kopf und es wird nicht getauscht.

Ich denke, es liegt daran, dass einige Prozesse auf das Festplatten-E / A warten, und ich möchte sehen, was darauf wartet.

Gibt es ein Programm, das mir zeigt, welche Prozesse auf IO warten? Ich weiß über, iotopaber das zeigt, was derzeit IO tut.

Oder ist das eine dumme Frage? (Wenn ja wie erklären :))

Rory
quelle

Antworten:

47

Sie können einen E / A-Monitor wie iotop verwenden, er zeigt jedoch nur Prozesse oder Threads mit aktuellen E / A-Vorgängen an.

Wenn Sie Prozesse durchsuchen müssen, die auf E / A warten, verwenden Sie watch, um Prozesse mit dem STAT-Flag 'D' wie folgt zu überwachen:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"
Ali Mezgani
quelle
Süss. Das hat mir sehr geholfen.
Stu Thompson
2
Alternativ können Sie den Befehl "iotop -o" verwenden, der nur "Prozesse oder Threads, die tatsächlich E / A ausführen" gemäß der iotop -Hilfe anzeigt.
Ryan
1
@ Ryan Abgesehen davon, dass er nicht die erforderlichen iowaitInformationen liefert , iotopsind erhöhte Berechtigungen erforderlich. watch, psUnd awkgibt nur die erforderlichen Informationen, und erfordert keine erhöhten Privilegien.
Rich
4
Ich hätte die psPOSIX - Flags verwendet und awkanders herausgeschnitten: watch "(ps -eo stat,pid,comm|awk '(NR==1)||(\$1~/D/){print}')"- Auf diese Weise erhalten Sie die Spaltenüberschriften und den Befehl stat, pid und.
Rich
18

ps axuund suchen Sie nach Prozessen, die sich im "D" -Zustand befinden. Basierend auf der Manpage ps (1) befinden sich Prozesse im Status D im unterbrechungsfreien Ruhezustand, was fast immer bedeutet, dass auf E / A gewartet wird. Leider ist es in der Regel nicht möglich, diese Prozesse zu beenden.

Zanchey
quelle
16

Zancheys Antwort ist die beste, die ich kenne, um herauszufinden, was auf IO wartet.

Was meinen Sie damit, wenn Sie sagen, Ihr Server ist unter hoher Last? Etwas spezielles reagiert langsam?

Wenn Sie sich fragen, ob Ihre Datenträger-E / A der Engpass ist, würde ich den Befehl iostat (Teil des sysstat-Pakets) verwenden, um festzustellen, ob der Datenträger tatsächlich stark ausgelastet ist.

Beispiel:

[kbrandt@kbrandt-opadmin: ~] iostat -x 1 3                                                                                           

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.38   34.71    2.64    1.18    0.00   59.21 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.11    17.35    2.21   20.31    46.57   301.40    15.45     2.27  100.66   1.48   3.34
sda1              0.10    17.31    2.21   20.31    46.48   301.10    15.44     2.27  100.66   1.48   3.34
sda2              0.00     0.00    0.00    0.00     0.00     0.00     3.50     0.00   30.00  30.00   0.00
sr0               0.00     0.00    0.00    0.00     0.00     0.00    18.44     0.00  677.67 512.61   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.22    0.00    4.31    0.00    0.00   89.47   
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sr0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
Kyle Brandt
quelle
1
Es wäre hilfreich zu erklären, wie die Ausgabe von iostat zu interpretieren ist, "um festzustellen, ob die Festplatte tatsächlich stark ausgelastet ist".
Scott Buchanan
0

Aktivieren block_dump Protokollierung , welche Prozesse tun Block Lese- / Schreiboperationen:

echo 1 > /proc/sys/vm/block_dump
tail -f /var/log/syslog

Wenn Sie fertig sind, deaktivieren Sie die Ablaufverfolgung, damit Sie Ihre Protokolldateien nicht als Spam versenden:

echo 0 > /proc/sys/vm/block_dump
Aleksandr Levchuk
quelle