He estado buscando en la iowait
propiedad 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 iowait
tiempo. 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"?
fuente
Respuestas:
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
intenta 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_iowait
campo detask_struct
; puede buscarin_iowait
en 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. Laiowait
entrada/proc/stat
, que es lo que terminatop
, 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 buscandoaccount_idle_time
en 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" ...
fuente