¿Cómo sabe una CPU que hay IO pendiente?

17

He estado buscando en la iowaitpropiedad que se muestra en la salida de la utilidad superior como se muestra a continuación.

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait generalmente se define de la siguiente manera:

"Es el tiempo durante el cual la CPU está inactiva y hay algunas E / S pendientes".

Tengo entendido que un proceso se ejecuta en una sola CPU. Después de que se desprograma ya sea porque ha agotado su intervalo de tiempo o después de que se bloquea, eventualmente se puede programar nuevamente en cualquier CPU nuevamente.

En caso de solicitud de E / S, una CPU que pone un proceso en suspensión ininterrumpida es responsable de rastrear el iowaittiempo. Las otras CPU estarían informando al mismo tiempo que el tiempo inactivo de su lado, ya que realmente están inactivas. ¿Es correcta esta suposición?

Además, suponiendo que haya una solicitud de E / S larga (lo que significa que el proceso tuvo varias oportunidades de ser programado pero no fue programado porque el E / S no estaba completo), ¿cómo sabe una CPU que hay "E / S pendiente"? ¿De dónde se obtiene ese tipo de información? ¿Cómo puede una CPU simplemente descubrir que algún proceso se suspendió en algún momento para que se complete un IO ya que cualquiera de las CPU podría haber suspendido ese proceso? ¿Cómo se confirma este estado de "IO pendiente"?

Alquimista
fuente
3
"Un proceso se ejecuta en una sola CPU". Realmente no. Un subproceso se ejecuta en un solo núcleo de CPU, pero los procesos modernos tienen múltiples subprocesos y las CPU modernas tienen múltiples núcleos.
MSalters
@MSalters E incluso entonces, si bien un solo subproceso solo se puede ejecutar en un núcleo en cualquier momento, el núcleo en el que se ejecuta puede cambiar después de cambiar el contexto.
JAB
1
Hay esta cosa llamada de petición de interrupción (IRQ), pero es tal vez más hardware que nos interesa.
mathreadler

Respuestas:

33

La CPU no sabe nada de esto, el planificador de tareas sí.

La definición que cita es algo engañosa; La página de procfs(5)manual actual tiene una definición más precisa, con advertencias:

iowait (desde Linux 2.5.41)

(5) Tiempo de espera para que se complete la E / S. Este valor no es confiable, por las siguientes razones:

  1. La CPU no esperará a que se complete la E / S; iowaites el tiempo que una tarea está esperando que se complete la E / S. Cuando una CPU entra en estado inactivo para la E / S de tareas pendientes, se programará otra tarea en esta CPU.

  2. En una CPU multinúcleo, la tarea que espera que se complete la E / S no se ejecuta en ninguna CPU, por lo que iowaites difícil calcular la de cada CPU.

  3. El valor en este campo puede disminuir en ciertas condiciones.

iowaitintenta medir el tiempo dedicado a esperar E / S, en general. No es rastreado por una CPU específica, ni puede serlo (punto 2 anterior, que también coincide con lo que te estás preguntando). Sin embargo, se mide por CPU, en la medida de lo posible.

El programador de tareas "sabe" que hay E / S pendientes, porque sabe que suspendió una tarea dada porque está esperando E / S. Esto se rastrea por tarea en el in_iowaitcampo de task_struct; puede buscar in_iowaiten el núcleo del planificador para ver cómo se establece, rastrea y borra. El reciente artículo de Brendan Gregg sobre promedios de carga de Linux incluye información de fondo útil. La iowaitentrada /proc/stat, que es lo que termina top, se incrementa cada vez que se tiene en cuenta un tic del temporizador, y el proceso actual "encendido" en la CPU está inactivo; puede ver esto buscando account_idle_timeen el código de seguimiento de tiempo de la CPU del planificador .

Por lo tanto, una definición más precisa sería "tiempo dedicado a esta CPU esperando E / S, cuando no había nada mejor que hacer" ...

Stephen Kitt
fuente