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


Ich habe einen Server, der eine wirklich hohe Last hat. In Bezug auf die CPU-Auslastung springt nichts über mich hinaus und es wird nicht getauscht.

Ich denke, das liegt daran, dass einige Prozesse auf die Datenträger-IO warten, und ich möchte sehen, was wartet.

Gibt es irgendein Programm, das mir zeigt, welche Prozesse auf IO warten? ich weiss Bescheid iotop aber das zeigt, was gerade IO macht.

Oder ist das eine dumme Frage? (Wenn ja, wie :))


38
2017-09-02 13:32


Ursprung




Antworten:


Sie können einen I / O-Monitor wie iotop verwenden, aber es werden nur Prozesse oder Threads mit aktuellen E / A-Vorgängen angezeigt.

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

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"

43
2017-09-02 14:00



Süss. Das hat mir sehr geholfen. - Stu Thompson
Alternativ können Sie den Befehl 'iotop -o' verwenden, der nur 'Prozesse oder Threads, die tatsächlich I / O ausführen' zeigt, wie im iotop --help beschrieben. - Ryan
@ Ryan Abgesehen davon nicht Bereitstellung der erforderlichen iowait Information, iotop erfordert erhöhte Berechtigungen. watch, ps, und awk Geben Sie nur die erforderlichen Informationen an und benötigen keine erhöhten Berechtigungen. - Rich
Ich hätte gebraucht psPOSIX-Flags und awkhabe es anders gemacht: watch "(ps -eo stat,pid,comm|awk '(NR==1)||(\$1~/D/){print}')" - Auf diese Weise erhalten Sie die Spaltenüberschriften sowie die Attribute stat, pid und command. - Rich


ps axu und nach Prozessen suchen, die sich im "D" -Zustand befinden. Basierend auf ps (1) manpageProzesse, die sich im D-Zustand befinden, befinden sich im unterbrechungsfreien Schlaf, was fast immer "Warten auf IO" bedeutet. Leider ist das Töten dieser Prozesse normalerweise nicht möglich.


16
2017-09-02 13:36





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

Wenn Sie sagen, dass Ihr Server unter hoher Last steht, was meinen Sie damit? Etwas speziell reagiert nur langsam?

Wenn Sie sich fragen, ob Ihr Disk IO der Engpass ist, würde ich den Befehl iostat (Teil des sysstat-Pakets) verwenden, um zu sehen, 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

14
2017-09-02 13:42



Es wäre hilfreich zu erklären, wie man die Ausgabe von iostat interpretiert, um zu sehen, ob die Platte tatsächlich unter starker Belastung steht. - Scott Buchanan


Aktivieren block_dump Protokollierung der Prozesse, die Block-Lese- / Schreiboperationen ausführen:

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 spammen:

echo 0 > /proc/sys/vm/block_dump

0
2017-12-29 21:20