Eu estive olhando para a iowait
propriedade mostrada na saída do utilitário superior, como 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á algumas informações pendentes".
Entendo que um processo é executado em uma única CPU. Depois que ele é desmarcado, porque ele esgotou seu horário ou depois de ser bloqueado, ele pode ser agendado novamente em qualquer CPU novamente.
No caso de solicitação de E / S, uma CPU que coloca um processo em suspensão ininterrupta é responsável por rastrear o iowait
tempo. As outras CPUs relatariam o mesmo tempo que o tempo ocioso no final, pois realmente estão ociosos. 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 agendamento, mas não foi agendado porque a IO não estava completa), como uma CPU sabe que há "IO pendente"? De onde esse tipo de informação é obtido? Como uma CPU pode simplesmente descobrir que algum processo foi adiado por algum tempo para que um IO seja concluído, pois qualquer uma das CPUs poderia ter adiado esse processo. Como é confirmado esse status de "IO pendente"?
fonte
Respostas:
A CPU não sabe nada disso, o agendador de tarefas sabe.
A definição que você cita é um pouco enganadora; a página de
procfs(5)
manual atual tem uma definição mais precisa, com ressalvas:iowait
tenta medir o tempo gasto aguardando E / S, em geral. Ele 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á E / S pendente, porque sabe que suspendeu uma determinada tarefa porque está aguardando E / S. 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 médias de carga do Linux inclui informações básicas úteis. Aiowait
entrada/proc/stat
, que é o que terminatop
, é incrementada sempre que um tick de timer é contabilizado, e o processo atual de ativação da CPU fica ocioso; você pode ver isso procurandoaccount_idle_time
no código de rastreamento de tempo da CPU do agendador .Portanto, uma definição mais precisa seria "tempo gasto nesta CPU aguardando E / S, quando não havia nada melhor para fazer" ...
fonte