Linux - Comment puis-je voir ce qui attend l'attaque d'E / S de disque

42

J'ai un serveur qui a une charge très élevée. Rien ne me saute aux yeux en termes d'utilisation du processeur, et ce n'est pas un échange.

Je pense que cela est dû au fait que certains processus attendent des entrées / sorties sur disque et je veux voir ce qui les attend.

Existe-t-il un programme qui me montre quels processus attendent IO? Je sais à propos de iotopmais cela montre ce que font actuellement IO.

Ou est-ce une question idiote? (Si oui, expliquez comment :))

Rory
la source

Réponses:

47

Vous pouvez utiliser un moniteur d'E / S comme iotop, mais il ne vous montrera que les processus ou les threads avec les opérations d'E / S en cours.

Si vous devez parcourir les processus en attente d'E / S, utilisez watch pour surveiller les processus avec l'indicateur STAT 'D' comme ci-dessous:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"
Ali Mezgani
la source
Doux. Cela m'a bien aidé.
Stu Thompson
2
Vous pouvez également utiliser la commande 'iotop -o' qui ne montrera que les processus ou les threads effectuant réellement les E / S, conformément à l'aide de iotop --help.
Ryan
1
@Ryan En plus de ne pas fournir les iowaitinformations requises , iotopnécessite des privilèges élevés. watch, psEt awkne donner que les informations nécessaires, et ne nécessitent pas des privilèges élevés.
Rich
4
J'aurais utilisé psles drapeaux POSIX et les awkéditer différemment: watch "(ps -eo stat,pid,comm|awk '(NR==1)||(\$1~/D/){print}')"- de cette façon, vous obtenez les en-têtes de colonne, ainsi que les propriétés stat, pid et command.
Rich
18

ps axuet recherchez les processus qui sont dans l'état "D". Sur la base de la page de manuel ps (1) , les processus en état D sont en veille ininterrompue, ce qui signifie presque toujours "en attente d'IO". Malheureusement, il n'est généralement pas possible de tuer ces processus.

Zanchey
la source
16

La réponse de Zanchey est la meilleure que je connaisse pour savoir ce qui attend IO.

Lorsque vous dites que votre serveur est soumis à une charge de travail élevée, qu'entendez-vous par là? Quelque chose en particulier est lent à réagir?

Si vous vous demandez si votre disque d'E / S est le goulot d'étranglement, j'utiliserais la commande iostat (une partie du package sysstat) pour voir si le disque est réellement soumis à une charge importante.

Exemple:

[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
la source
1
Il serait utile d'expliquer comment interpréter la sortie d'iostat "pour voir si le disque est réellement soumis à une charge importante".
Scott Buchanan
0

Activez la journalisation block_dump des processus effectuant des opérations de lecture / écriture en mode bloc:

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

Lorsque vous avez terminé, désactivez le traçage pour ne pas spammer vos fichiers journaux:

echo 0 > /proc/sys/vm/block_dump
Aleksandr Levchuk
la source