Linux: ¿cómo puedo ver qué está esperando el disco IO?

42

Tengo un servidor que tiene una carga realmente alta. Nada me llama la atención en términos de uso de CPU, y no se intercambia.

Creo que es porque algunos procesos están esperando el disco IO, y quiero ver qué está esperando.

¿Hay algún programa que me muestre qué procesos están esperando IO? Lo sé, iotoppero eso muestra lo que está haciendo actualmente IO.

¿O es una pregunta tonta? (Si es así, explique cómo :))

Rory
fuente

Respuestas:

47

Puede usar un monitor de E / S como iotop, pero solo le mostrará procesos o subprocesos con las operaciones de E / S actuales.

Si necesita examinar procesos que esperan E / S, use watch para monitorear procesos con el indicador STAT 'D' como se muestra a continuación:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"
Ali Mezgani
fuente
Dulce. Esto me ayudó muy bien.
Stu Thompson
2
Alternativamente, puede usar el comando 'iotop -o' que solo mostrará 'procesos o hilos que realmente hacen E / S' según iotop --help.
Ryan
1
@Ryan Aparte de no proporcionar la iowaitinformación requerida , iotoprequiere privilegios elevados. watch, psy awkbrinde solo la información necesaria, y no requiere privilegios elevados.
Rico
44
Hubiera usado pslos indicadores POSIX y los awkhubiera editado de manera diferente: watch "(ps -eo stat,pid,comm|awk '(NR==1)||(\$1~/D/){print}')"- de esta manera obtienes los encabezados de columna, y el stat, pid y command.
Rico
18

ps axuy busque procesos que estén en el estado "D". Según la página de manual de ps (1) , los procesos que se encuentran en el estado D están en suspensión ininterrumpida, lo que casi siempre significa 'esperando IO'. Desafortunadamente, matar estos procesos generalmente no es posible.

Zanchey
fuente
16

La respuesta de Zanchey es la mejor que sé para averiguar qué está esperando a IO.

Cuando dice que su servidor está bajo una carga alta, ¿qué quiere decir con eso? ¿Algo en particular tarda en responder?

Si se pregunta si su Disk IO es el cuello de botella, usaría el comando iostat (parte del paquete sysstat) para ver si el disco está realmente bajo una gran carga.

Ejemplo:

[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
fuente
1
Sería útil explicar cómo interpretar la salida de iostat "para ver si el disco está realmente bajo una gran carga".
Scott Buchanan
0

Habilite el registro block_dump de los procesos que realizan operaciones de lectura / escritura en bloque:

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

cuando termine, desactive el rastreo para no enviar spam a sus archivos de registro:

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