Alguém pode explicar exatamente o que é IOWait?

194

Por mais que eu tenha lido sobre iowait, ainda é um mistério para mim.

Sei que é o tempo gasto pela CPU aguardando a conclusão das operações de IO, mas que tipo de operações de IO com precisão? O que também não tenho certeza, é por que isso é tão importante? A CPU não pode simplesmente fazer outra coisa enquanto a operação de E / S é concluída e voltar ao processamento de dados?

Além disso, quais são as ferramentas certas para diagnosticar quais processos aguardaram exatamente o pedido de veiculação?

E quais são as maneiras de minimizar o tempo de espera de E / S?

Peter Krumins
fonte
E também, o que é alto iowait?
Muhamed Huseinbašić 27/02

Respostas:

99

Sei que é o tempo gasto pela CPU aguardando a conclusão das operações de IO, mas que tipo de operações de IO com precisão? O que também não tenho certeza, é por que isso é tão importante? A CPU não pode simplesmente fazer outra coisa enquanto a operação de E / S é concluída e voltar ao processamento de dados?

Sim, o sistema operacional agendará outros processos para serem executados enquanto um estiver bloqueado no IO. No entanto, nesse processo, a menos que esteja usando E / S assíncrona, ele não progredirá até que qualquer operação de E / S seja concluída.

Além disso, quais são as ferramentas certas para diagnosticar quais processos aguardaram exatamente o pedido de veiculação?

Algumas ferramentas que você pode achar úteis

  • iostat, para monitorar os tempos de serviço dos seus discos
  • iotop (se o seu kernel suportar), para monitorar o detalhamento das solicitações de E / S por processo
  • strace, para examinar as operações reais emitidas por um processo

E quais são as maneiras de minimizar o tempo de espera de E / S?

  • garantir que você tenha memória física livre para que o sistema operacional possa armazenar em cache os blocos de disco na memória
  • mantenha o uso do disco do sistema de arquivos abaixo de 80% para evitar fragmentação excessiva
  • ajustar seu sistema de arquivos
  • use um controlador de array com bateria
  • escolha bons tamanhos de buffer ao executar operações io
Dave Cheney
fonte
6
Não se esqueça "verifique se o armazenamento de back-end é rápido o suficiente para acompanhar sua carga de E / S".
Jgoldschrafe
1
@ Dave Cheney, e quando meu processo está ocioso, é porque está aguardando IO. Então, qual é a diferença entre IOWait e ocioso?
Ctrl-alt-delor
4
Quando no IOwait, o processo está em "suspensão ininterrupta", o que significa que não pode ser eliminado, para evitar os riscos de corromper os dados nos discos. um processo inativo normal não está realmente fazendo nada, então há menos riscos de matá-lo.
mveroone
1
No topo, praticamente significa que o seu IO é muito lento. "Tornar o servidor mais rápido" é diferente se você tem CPU limitada ou está com fome porque alguém decidiu que o disco notebook lento é suficiente para executar um servidor de banco de dados e a carga de IO faz com que a CPU use apenas 2% do que pode, esperando como louco para o IO terminar.
TomTom
OMG Não acredito que as 3 principais respostas aqui estão tão erradas . A resposta abaixo da haridsv está correta. Nenhuma CPU está "aguardando" a conclusão do io. Sim, alguns io podem estar bloqueando - geralmente há uma boa razão para isso e, em algumas circunstâncias, todo io pode estar bloqueando. Mas você também pode ver iowait ocorrendo para operações completamente assíncronas.
symcbean 17/09/16
47

Pergunta antiga, que acabou recentemente, mas considerou que as respostas existentes eram insuficientes.

Definição e propriedades do IOWait

IOWait (geralmente rotulado %wana parte superior) é uma subcategoria de inatividade ( %idlegeralmente expressa como todas as ociosas, exceto subcategorias definidas), o que significa que a CPU não está fazendo nada. Portanto, enquanto houver outro processo que a CPU possa estar processando, ele fará isso. Além disso, ocioso, usuário, sistema, iowait etc. são uma medida em relação à CPU. Em outras palavras, você pode pensar em iowait como o ocioso causado pela espera de io.

Precisamente, iowait é o tempo gasto recebendo e manipulando interrupções de hardware como uma porcentagem dos tiques do processador. As interrupções de software geralmente são ativadas separadamente como %si.

Importância e equívoco potencial

O IOWait é importante porque geralmente é uma métrica essencial para saber se você está com gargalo no IO. Mas a ausência de iowait não significa necessariamente que seu aplicativo não esteja com gargalo no IO. Considere dois aplicativos em execução em um sistema. Se o programa 1 estiver com um gargalo bastante io e o programa 2 for um usuário pesado da CPU, o %user + %systemda CPU ainda poderá ser algo como ~ 100% e, correspondentemente, o iowait mostrará 0. Mas isso é apenas porque o programa 2 é intenso e parece relativamente não dizer nada sobre programa 1 porque tudo isso é do ponto de vista da CPU.

Ferramentas para detectar IOWait

Ver post de Dave Cheney e Xerxes

Mas também um simples topserá exibido %wa.

Reduzindo a IOWait

Além disso, como agora estamos quase entrando em 2013, além do que outros disseram, a opção de dispositivos de armazenamento de E / S simplesmente incríveis é acessível, ou seja, SSDs. SSDs são incríveis !!!

Mal humorado
fonte
35

iowait

iowaité o tempo que o processador / processadores está aguardando (ou seja, está em um estado ocioso e não faz nada ), durante o qual de fato houve solicitações de E / S de disco pendentes.

Isso geralmente significa que os dispositivos de bloco (ou seja, discos físicos, não memória) são muito lentos ou simplesmente saturados.

Portanto, observe que, se você observar uma alta média de carga em seu sistema e, no aviso de inspeção, que a maior parte disso é devido à espera de E / S, isso não significa necessariamente que seu sistema esteja com problemas - e isso ocorre quando o seu a máquina simplesmente não tem nada a fazer, além de processos vinculados à E / S (ou seja, processos que fazem mais E / S do que qualquer outra coisa (chamadas de sistema não vinculadas à E / S)). Isso também deve ser aparente pelo fato de que qualquer coisa que você faça no sistema ainda é muito responsiva.

Ferramentas

  • sar(do sysstatpacote, disponível na maioria das máquinas * nix)
  • iostat
  • sarface(um front-end para sar)
Xerxes
fonte
7
Observe que, estritamente falando, essa definição de tempo de espera de E / S é válida apenas em sistemas de processador único. Ele precisa ser um pouco refinado para sistemas multi-processador: veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen
Até que ponto iowaitafeta Load Average? Digamos, 100 threads aguardando pela rede, LA será 100?
Ivan Balashov
32

Achei a explicação e os exemplos deste link muito úteis: O que exatamente é "iowait"? . Por uma questão de integridade, a E / S aqui se refere à E / S do disco, mas também pode incluir a E / S em um disco montado em rede (como nfs), conforme explicado nesta outra publicação .

Vou citar algumas seções importantes (caso o link fique inoperante), algumas delas seriam repetições do que outros já disseram, mas para mim pelo menos essas eram mais claras:

Para resumir em uma frase, 'iowait' é a porcentagem de tempo que a CPU está ociosa E há pelo menos uma E / S em andamento.

Cada CPU pode estar em um dos quatro estados: usuário, sys, ocioso, iowait.

Fiquei me perguntando o que acontece quando o sistema tem outros processos prontos para serem executados enquanto um processo aguarda E / S. O abaixo explica:

Se a CPU estiver ociosa, o kernel determinará se há pelo menos uma E / S atualmente em andamento em um disco local ou em um disco montado remotamente (NFS) que foi iniciado a partir dessa CPU. Se houver, o contador 'iowait' é incrementado em um. Se não houver E / S em andamento iniciada nessa CPU, o contador 'inativo' será incrementado em um.

E aqui está um exemplo:

Digamos que existem dois programas em execução na CPU. Um é um programa 'dd' que lê do disco. O outro é um programa que não realiza E / S, mas gasta 100% de seu tempo realizando trabalhos computacionais. Agora suponha que haja um problema com o subsistema de E / S e que as E / S físicas estejam demorando um segundo para serem concluídas. Sempre que o programa 'dd' estiver em suspensão enquanto aguarda a conclusão de suas E / Ss, o outro programa poderá executar nessa CPU. Quando a interrupção do relógio ocorre, sempre haverá um programa em execução no modo de usuário ou no sistema. Portanto, os valores de% ocioso e% iowait serão 0. Mesmo que iowait seja 0 agora, isso não significa que NÃO há um problema de E / S, porque obviamente existe um se as E / S físicas estiverem demorando um segundo para serem concluídas.

Vale a pena ler o texto completo. Aqui está um espelho desta página , caso ela caia.

haridsv
fonte
1

No Solaris, eu uso o DTrace para verificar o que os processos estão fazendo se precisar ver quais operações de E / S estão em execução. Para Linux, existe um programa semelhante chamado systemtap que fornece um nível semelhante de exposição ao kernel e às chamadas de processo.

Um exemplo que usei ao aprender o DTrace foi comparar um cpcomando com um ddcomando. Você pode ver que ddfaz muito mais leituras para a gravação, enquanto cpnão, principalmente por causa do tamanho do buffer ddusado por padrão (se estou lembrando corretamente).

Milner
fonte
0

Que tipo de operações de E / S dependerá de seus aplicativos e configuração.

É importante, pois em alguns casos a CPU não pode obter os dados ou instruções necessárias para continuar. Em alguns casos, ele pode continuar, mas dependerá de quais aplicativos estão sendo executados e do que ele pode fazer. Se você tiver um único aplicativo encadeado que tenha muito acesso ao disco, precisará aguardar.

Para minimizar o tempo de IO, compre mais e mais memória, obtenha discos mais rápidos, desfragmentar os discos que você possui.

Se for um aplicativo interno, que é o gargalo, veja se ele pode ser otimizado para ler em blocos maiores ou executar E / S de forma assíncrona.

Jeremy French
fonte
Ok, então iowait é o tempo gasto em uma operação de bloqueio de E / S?
27640 Peter Krumins
Então, por exemplo, se eu fizer um select () ou poll () e ele bloquear, o tempo de espera até que um descritor se torne disponível constituirá o tempo de iowait?
27640 Peter Krumins
Eu acho que isso pertenceria ao SO, pois parece uma questão de programação.
305 Jeremy French
Peteris - sim, é uma boa maneira de pensar sobre isso.
User2278 27/05/09
0

usar ps aux pode imprimir o processo STAT
se stat for D ou Ds, o processo está em suspensão ininterrupta (geralmente IO)
quando um processo entra em suspensão ininterrupta, nr_iowait de runqueue é adicionado e, se nr_iowait> 0, o tempo ocioso da CPU é contado para iowait

O vmstat também mostra quantos blocos de processos
r: O número de processos aguardando pelo tempo de execução.
b: O número de processos em suspensão ininterrupta.

http://bencane.com/2012/08/06/trou Troubleshooting-high-io-wait-in-linux/

Singo
fonte