¿Alguien puede explicar con precisión qué es IOWait?

194

Por mucho que haya leído sobre iowait, todavía es un misterio para mí.

Sé que es el tiempo que pasa la CPU esperando que se completen las operaciones de E / S, pero ¿qué tipo de operaciones de E / S exactamente? Lo que tampoco estoy seguro es por qué es tan importante. ¿No puede la CPU hacer otra cosa mientras se completa la operación de E / S y luego volver a procesar los datos?

Además, ¿cuáles son las herramientas adecuadas para diagnosticar qué proceso (s) esperaron exactamente IO?

¿Y cuáles son las formas de minimizar el tiempo de espera IO?

Peter Krumins
fuente
Y también, ¿qué es alto iowait?
Muhamed Huseinbašić

Respuestas:

99

Sé que es el tiempo que pasa la CPU esperando que se completen las operaciones de E / S, pero ¿qué tipo de operaciones de E / S exactamente? Lo que tampoco estoy seguro es por qué es tan importante. ¿No puede la CPU hacer otra cosa mientras se completa la operación de E / S y luego volver a procesar los datos?

Sí, el sistema operativo programará otros procesos para ejecutarse mientras uno está bloqueado en IO. Sin embargo, dentro de ese proceso, a menos que use IO asincrónico, no progresará hasta que se complete la operación de IO.

Además, ¿cuáles son las herramientas adecuadas para diagnosticar qué proceso (s) esperaron exactamente IO?

Algunas herramientas que te pueden resultar útiles

  • iostat, para controlar los tiempos de servicio de sus discos
  • iotop (si su núcleo lo admite), para supervisar el desglose de las solicitudes de E / S por proceso
  • strace, para ver las operaciones reales emitidas por un proceso

¿Y cuáles son las formas de minimizar el tiempo de espera IO?

  • asegúrese de tener memoria física libre para que el sistema operativo pueda almacenar en caché los bloques de disco en la memoria
  • mantenga el uso del disco de su sistema de archivos por debajo del 80% para evitar una fragmentación excesiva
  • afina tu sistema de archivos
  • usar un controlador de matriz con batería de respaldo
  • elegir buenos tamaños de búfer al realizar operaciones io
Dave Cheney
fuente
66
No olvide "asegurarse de que su almacenamiento de back-end sea lo suficientemente rápido como para mantenerse al día con su carga de E / S".
jgoldschrafe
1
@Dave Cheney, y cuando mi proceso está inactivo es porque está esperando a IO. Entonces, ¿cuál es la diferencia entre IOWait e inactivo?
ctrl-alt-delor
44
Cuando en IOwait, el proceso está en "suspensión ininterrumpida", lo que significa que no se puede eliminar, para evitar el riesgo de corromper los datos en los discos. un proceso inactivo normal realmente no está haciendo nada, por lo que hay menos riesgos de matarlo.
mveroone
1
Además, prácticamente significa que su IO es demasiado lenta. "Hacer que el servidor sea más rápido" es diferente, ya sea que tenga una CPU limitada o su CPU se esté muriendo de hambre porque alguien decidió que el disco lento del portátil es suficiente para ejecutar un servidor de base de datos y la carga de E / S hace que la CPU solo use el 2% de lo que puede, esperando como loco por el IO para terminar.
TomTom
Dios mío, no puedo creer que las 3 mejores respuestas aquí estén tan equivocadas . La respuesta a continuación por haridsv es correcta. Ninguna CPU está "esperando" a que se complete el io. Sí, algunos io pueden estar bloqueando, a menudo hay una buena razón para esto, y en algunas circunstancias todo io puede estar bloqueando. Pero también puede ver que se produce iowait para operaciones completamente asincrónicas.
symcbean
47

Antigua pregunta, recientemente rechazada, pero consideró que las respuestas existentes eran insuficientes.

IOWait definición y propiedades

IOWait (generalmente etiquetado %waen la parte superior) es una subcategoría de inactivo ( %idlegeneralmente se expresa como inactivo excepto las subcategorías definidas), lo que significa que la CPU no está haciendo nada. Por lo tanto, siempre que haya otro proceso que la CPU pueda estar procesando, lo hará. Además, inactivo, usuario, sistema, iowait, etc. son una medida con respecto a la CPU. En otras palabras, puede pensar en iowait como la inactividad causada por esperar a io.

Precisamente, iowait es el tiempo dedicado a recibir y manejar interrupciones de hardware como un porcentaje de tics de procesador. Las interrupciones de software generalmente se etiquetan por separado como %si.

Importancia y potencial malentendido

IOWait es importante porque a menudo es una métrica clave para saber si tiene un cuello de botella en IO. Pero la ausencia de iowait no significa necesariamente que su aplicación no tenga cuellos de botella en IO. Considere dos aplicaciones que se ejecutan en un sistema. Si el programa 1 tiene un cuello de botella muy io y el programa 2 es un gran usuario de CPU, la %user + %systemCPU todavía puede ser algo así como ~ 100% y, en consecuencia, iowait mostrará 0. Pero eso es solo porque el programa 2 es intensivo y relativamente parece no decir nada sobre programa 1 porque todo esto es desde el punto de vista de la CPU.

Herramientas para detectar IOWait

Ver publicaciones de Dave Cheney y Xerxes

Pero también topse mostrará un simple %wa.

Reducción de IOWait

Además, como ya casi estamos entrando en 2013, además de lo que otros dijeron, la opción de dispositivos de almacenamiento de E / S simplemente increíbles es asequible, es decir, SSD. ¡Los SSD son increíbles!

Gruñón
fuente
35

iowait

iowaites el tiempo que el procesador / procesadores están esperando (es decir, está en un estado inactivo y no hace nada ), durante el cual, de hecho, hubo solicitudes pendientes de E / S de disco.

Esto generalmente significa que los dispositivos de bloque (es decir, discos físicos, no memoria) son demasiado lentos o simplemente están saturados.

Por lo tanto, debe tener en cuenta que si ve un promedio de carga alto en su sistema, y ​​en el aviso de inspección de que la mayor parte de esto se debe realmente a la espera de E / S, no significa necesariamente que su sistema esté en problemas, y esto ocurre cuando su la máquina simplemente no tiene nada que hacer, aparte de los procesos vinculados a E / S (es decir, procesos que hacen más E / S que cualquier otra cosa (llamadas de sistema no vinculadas a E / S)). Eso también debería ser evidente por el hecho de que todo lo que haces en el sistema sigue siendo muy receptivo.

herramientas

  • sar(del sysstatpaquete, disponible en la mayoría de las máquinas * nix)
  • iostat
  • sarface(un front-end para sar)
Jerjes
fuente
77
Tenga en cuenta que, estrictamente hablando, esa definición de tiempo de espera de E / S solo es válida en sistemas de un solo procesador. Debe ser algo refinado para sistemas multiprocesador
Andreas Veithen
¿En qué medida iowaitafecta Load Average? Digamos, 100 hilos esperando la red, ¿será LA 100?
Ivan Balashov
32

La explicación y los ejemplos de este enlace me parecieron muy útiles: ¿Qué es exactamente "iowait"? . Por cierto, en aras de la integridad, la E / S aquí se refiere a E / S de disco, pero también podría incluir E / S en un disco montado en red (como nfs), como se explica en esta otra publicación .

Citaré algunas secciones importantes (en caso de que el enlace se bloquee), algunas de ellas serían repeticiones de lo que otros ya han dicho, pero para mí al menos estas fueron más claras:

Para resumirlo en una oración, 'iowait' es el porcentaje de tiempo que la CPU está inactiva Y hay al menos una E / S en progreso.

Cada CPU puede estar en uno de cuatro estados: usuario, sys, inactivo, iowait.

Me preguntaba qué sucede cuando el sistema tiene otros procesos listos para ejecutarse mientras un proceso está esperando E / S. Lo siguiente lo explica:

Si la CPU está inactiva, el núcleo determina si hay al menos una E / S actualmente en progreso para un disco local o un disco montado remotamente (NFS) que se había iniciado desde esa CPU. Si lo hay, entonces el contador 'iowait' se incrementa en uno. Si no hay E / S en progreso que se inició desde esa CPU, el contador 'inactivo' se incrementa en uno.

Y aquí hay un ejemplo:

Digamos que hay dos programas ejecutándose en una CPU. Uno es un programa 'dd' que lee desde el disco. El otro es un programa que no realiza E / S, pero dedica el 100% de su tiempo a realizar trabajos computacionales. Ahora suponga que hay un problema con el subsistema de E / S y que las E / S físicas tardan más de un segundo en completarse. Cada vez que el programa 'dd' está inactivo mientras espera que se completen sus E / S, el otro programa puede ejecutarse en esa CPU. Cuando se produce la interrupción del reloj, siempre habrá un programa ejecutándose en modo de usuario o en modo de sistema. Por lo tanto, los valores% inactivo y% iowait serán 0. Aunque iowait es 0 ahora, eso no significa que NO haya un problema de E / S porque obviamente existe uno si las E / S físicas están tardando más de un segundo en completarse.

Vale la pena leer el texto completo. Aquí hay un espejo de esta página , en caso de que se caiga.

revs haridsv
fuente
1

Para Solaris, uso DTrace para ver qué están haciendo los procesos si necesito ver qué operaciones de E / S se están ejecutando. Para Linux, hay un programa similar llamado systemtap que proporciona un nivel similar de exposición al núcleo y a las llamadas de proceso.

Un ejemplo que usé cuando aprendí DTrace fue comparar un cpcomando con un ddcomando. Puede ver que ddhace muchas más lecturas para la escritura, mientras cpque no lo hace, principalmente debido al dduso del tamaño del búfer de forma predeterminada (si no recuerdo mal).

Milner
fuente
0

El tipo de operaciones de E / S dependerá de sus aplicaciones y configuración.

Es importante ya que en algunos casos la CPU no puede obtener los datos o las instrucciones que necesita para continuar. En algunos casos puede continuar, pero dependerá de qué aplicaciones se estén ejecutando en cuanto a lo que puede hacer. Si tiene una aplicación de un solo subproceso que tiene mucho acceso al disco, deberá esperar.

Para minimizar el tiempo de E / S, compre más memoria y más rápido, obtenga discos más rápidos, defragmente los discos que tenga.

Si se trata de una aplicación interna, que es el cuello de botella, vea si puede optimizarse para leer en bloques más grandes o para hacer IO de forma asincrónica.

Jeremy French
fuente
De acuerdo, entonces, ¿qué tiempo pasa en una operación de bloqueo de E / S?
Peter Krumins
Entonces, por ejemplo, si hago un select () o poll () y se bloquea, ¿el tiempo de espera hasta que un descriptor esté disponible constituirá el tiempo de espera?
Peter Krumins
Creo que eso pertenecería a SO ya que parece una pregunta de programación.
Jeremy French
Peteris: sí, esa es una buena manera de pensarlo.
user2278
0

el uso de ps aux puede imprimir el proceso STAT
si stat es D o Ds, el proceso está en suspensión ininterrumpible (generalmente IO)
cuando un proceso ingresa en suspensión ininterrumpible, se agrega nr_iowait de runqueue y si nr_iowait> 0, se cuenta el tiempo de inactividad de la CPU a esperar

vmstat también muestra cuántos bloques de procesos
r: El número de procesos que esperan el tiempo de ejecución.
b: El número de procesos en suspensión ininterrumpida.

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

Singo
fuente