Eu tenho examinado a iowait
propriedade mostrada na saída do utilitário superior, conforme mostrado abaixo.
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
é geralmente definido da seguinte forma:
"É o tempo durante o qual a CPU está ociosa e há algum IO pendente."
É meu entendimento que um processo é executado em uma única CPU. Depois de ser desprogramado porque esgotou seu intervalo de tempo ou depois de ser bloqueado, ele pode eventualmente ser agendado novamente em qualquer CPU novamente.
No caso de solicitação de IO, uma CPU que coloca um processo em hibernação ininterrupta é responsável por rastrear o iowait
tempo. As outras CPUs estariam relatando o mesmo tempo que o tempo ocioso, pois realmente estão ociosas. Essa suposição está correta?
Além disso, supondo que haja uma solicitação de IO longa (o que significa que o processo teve várias oportunidades de ser agendado, mas não foi agendado porque o IO não foi concluído), como uma CPU sabe que há "IO pendente"? De onde é obtido esse tipo de informação? Como uma CPU pode simplesmente descobrir que algum processo foi colocado em hibernação em algum momento para que um IO seja concluído, pois qualquer uma das CPUs poderia ter colocado esse processo em hibernação. Como esse status de "IO pendente" é confirmado?
A CPU não sabe nada disso, o agendador de tarefas sabe.
A definição que você cita é um tanto enganosa;
procfs(5)
a página de manual atual tem uma definição mais precisa, com ressalvas:iowait
tenta medir o tempo gasto esperando por I/O, em geral. Não é rastreado por uma CPU específica, nem pode ser (ponto 2 acima - que também corresponde ao que você está pensando). É medido por CPU, na medida do possível.O agendador de tarefas “sabe” que há I/O pendente, pois sabe que suspendeu uma determinada tarefa porque está aguardando I/O. Isso é rastreado por tarefa no
in_iowait
campo dotask_struct
; você pode procurarin_iowait
no núcleo do agendador para ver como ele é definido, rastreado e limpo. O artigo recente de Brendan Gregg sobre as médias de carga do Linux inclui informações úteis sobre o histórico. Aiowait
entrada em/proc/stat
, que é o que termina emtop
, é incrementada sempre que um tique do timer é contabilizado e o processo atual “ligado” à CPU está ocioso; você pode ver isso procurandoaccount_idle_time
no código de rastreamento de tempo da CPU do agendador .Então uma definição mais precisa seria “tempo gasto nessa CPU esperando por E/S, quando não havia nada melhor para fazer”...