Linux - Como posso ver o que está aguardando o disco IO

42

Eu tenho um servidor que tem uma carga muito alta. Nada está saltando para mim em termos de uso da CPU, e não está trocando.

Acho que é porque alguns processos estão aguardando E / S de disco e quero ver o que está aguardando.

Existe algum programa que me mostre quais processos estão aguardando IO? Eu sei, iotopmas isso mostra o que está fazendo no momento.

Ou isso é uma pergunta boba? (Se sim, explique como :))

Rory
fonte

Respostas:

47

Você pode usar um monitor de E / S como o iotop, mas ele mostrará apenas processos ou threads com operações de E / S atuais.

Se você precisar procurar processos aguardando E / S, use o watch para monitorar processos com o sinalizador STAT 'D' como abaixo:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"
Ali Mezgani
fonte
Doce. Isso me ajudou muito bem.
Stu Thompson
2
Como alternativa, você pode usar o comando 'iotop -o', que mostrará apenas 'processos ou threads realmente executando E / S', de acordo com o iotop --help.
Ryan
1
@ Ryan Além de não fornecer as iowaitinformações necessárias , é iotopnecessário privilégios elevados. watch, psE awkdar apenas a informação necessária, e não requerem privilégios elevados.
Rich
4
Eu teria usado psos sinalizadores POSIX e awkeditado de maneira diferente: watch "(ps -eo stat,pid,comm|awk '(NR==1)||(\$1~/D/){print}')"- desta forma, você obtém os títulos das colunas e o stat, pid e command.
Rich
18

ps axue procure processos que estão no estado "D". Com base na página de manual ps (1) , os processos que estão no estado D estão em suspensão ininterrupta, o que quase sempre significa 'aguardando E / S'. Infelizmente, matar esses processos geralmente não é possível.

Zanchey
fonte
16

A resposta de Zanchey é a melhor que eu conheço para descobrir o que está esperando por IO.

Quando você diz que seu servidor está sob alta carga, o que você quer dizer com isso? Algo em particular é lento para responder?

Se você está se perguntando se o seu disco IO é o gargalo, eu usaria o comando iostat (parte do pacote sysstat) para ver se o disco está realmente sob carga pesada.

Exemplo:

[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
fonte
1
Seria útil explicar como interpretar a saída do iostat "para ver se o disco está realmente sob carga pesada".
Scott Buchanan
0

Habilite o log block_dump de quais processos estão executando operações de leitura / gravação em bloco:

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

Quando terminar, desative o rastreamento para não enviar spam aos seus arquivos de log:

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