¿Por qué la CPU pasó tiempo en IO (wa)?

18

Sé que wa(in top) mide el tiempo de CPU en espera de E / S. Muchos artículos dicen eso.

Pero estoy confundido, basado en 2 puntos de conocimiento:

  1. Si un proceso utiliza una llamada del sistema para leer el disco, el proceso se bloquea.
  2. Si un proceso está bloqueado, no se puede programar su ejecución en la CPU.

¿Derecho?

Parece que no hay tiempo para que la CPU espere E / S ... ¿Qué sucede?

Si me recomiendan algunos libros o artículos para leer más, mucho mejor.

HUA Di
fuente
Entré y escribí una respuesta adecuada. Lo siento, no estaba allí cuando me necesitabas ;-)
Alec Teal

Respuestas:

22

El estado inactivo de la CPU se divide en dos estados "sub" diferentes: iowaity idle.

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

Entonces, iowaites el porcentaje de tiempo que la CPU está inactiva Y hay al menos una E / S en curso iniciada desde esa CPU.

El iowaitcontador indica que el sistema puede manejar más trabajo computacional. El hecho de que una CPU esté en iowaitestado no significa que no pueda ejecutar otros subprocesos o procesos en esa CPU.

Entonces, iowaites simplemente una forma de tiempo inactivo.

caos
fuente
Esto es realmente falso. También NFS: la CPU ni siquiera tiene un concepto de eso. Básicamente es el tiempo que la CPU ha pasado incapaz de hacer otra cosa porque se trata de algunas cosas de E / S de bajo nivel, en el sentido de acceder a algo conectado a ella NO procesa E / S, que generalmente está leyendo archivos y otras cosas. Por ejemplo, en la Raspberry Pi no hay un controlador DMA, por lo que la CPU no puede ir "hey Motherboard, léame todos estos bytes comenzando aquí desde la tarjeta y póngalos en el ram comenzando aquí", debe hacerlo manualmente->
Alec Teal
por lo que pasa MUCHO tiempo CONSTANTEMENTE esperando io como para que se complete una lectura de tarjeta. Hace que parezca que una "pérdida de caché" podría medirse mediante esta "espera io" (que por supuesto no se cuenta), la espera IO se define de la siguiente manera: El tiempo que el núcleo ha pasado dentro de una rutina de E / S de dispositivos de bajo nivel, por ejemplo el RPi, literalmente tiene que hacer el procedimiento de lectura de la tarjeta y la CPU (que es un grupo sin DMA) tiene que esperar los datos en el bus IO. Con un controlador DMA, le habla al controlador y le dice "dime cuando hayas terminado", dejándolo para hacer otras cosas mientras el controlador DMA hace el dispositivo IO
Alec Teal
Use dstat para ver IOwaiting BTW, también iowait y el tiempo dedicado a hacer cosas de kernel realmente no se pueden medir por proceso. Como digamos que hay dos procesos que "escriben" en "archivos", el primero se completa rápidamente, el FS eligió guardar en caché las escrituras por cualquier razón, el segundo hace que el caché se vacíe, no es justo contar el tiempo mucho más largo para regresar desde la escritura hasta el proceso que causó la escritura. Lo mismo ocurre con la espera de E / S, por lo que no se miden por proceso.
Alec Teal
44
@AlecTeal: No, es correcto y sus comentarios son falsos. iowait cuenta el tiempo bloqueado en E / S, sin servicio de E / S. Si no desea confirmar esto leyendo la fuente del núcleo, intente un experimento: monte un sistema de archivos de red, comience a leer un archivo y luego corte el firewall de la máquina remota. El tiempo de espera seguirá siendo alto aunque el procesador esté completamente inactivo.
David
1
Hice una prueba con esta respuesta. dd if=/dev/sda of=/dev/nullpara hacer un alto wa. Luego, ejecute un código while-true, waes en lugar de us. Gracias caos.
HUA Di
-2

No estoy 100% seguro de entender la pregunta, pero hay algunas ideas.

Hay otra pregunta aquí que pregunta esto y tiene algunas buenas respuestas: ¿Alguien puede explicar con precisión qué es IOWait?

Hay una buena publicación aquí: http://veithen.github.io/2013/11/18/iowait-linux.html

Mike Fiedler
fuente
77
Mike, se prefiere que las respuestas incluyan contenido, no solo enlaces a contenido. Al proporcionar contenido aquí, se asegura de que su respuesta aún tenga valor cuando esos enlaces desaparezcan.
EEAA
1
@EEAA, ¿entonces la respuesta debe ser editada, no rechazada por triplicado? O se puede mover a un comentario. Todavía contiene información útil. Los votos negativos significan que la información es inútil, ¿también haciéndola casi invisible? No estoy diciendo que hiciste un voto negativo, solo me pregunto sobre el enfoque que la gente tiene aquí.
Roland Pihlakas
3
@RolandPihlakas Es una cuestión de motivación. El voto negativo + comentario en esta situación motiva al usuario a corregir su respuesta. Con mucho gusto eliminaré mi dv después de que la respuesta sea corregida. La edición de estos es contraproducente, ya que permite un mal comportamiento. A lo largo de los años, hemos tenido varios usuarios que solo publicaron respuestas de solo enlace, a pesar de que se les pidió que no lo hicieran. Si los usuarios no pueden molestarse en poner un poco de esfuerzo en sus respuestas, no voy a ayudarlos arreglando su trabajo.
EEAA
@ EEAA Gracias por la elaborada respuesta. Su enfoque es comprensible y, a través de sus comentarios, también ofrece un empujón motivador para el autor de la respuesta. Por el contrario, me temo que los votos negativos silenciosos en su mayoría no ofrecen ninguna motivación práctica, ya que son oscuros. Pero era un poco impreciso: me preguntaba principalmente por qué la respuesta fue rechazada tanto que se atenuó. Su comentario con uno o dos votos negativos debería haber sido suficiente?
Roland Pihlakas
2
@RolandPihlakas La gente pensó que la respuesta no era útil, por lo que votaron en contra. Votaron en contra porque es martes. Votaron en contra porque hoy está nevando en Minneapolis (realmente, lo es, y no debería ser tan tarde en la primavera). Quién sabe.
EEAA