Como uma CPU sabe que há IO pendente?

17

Eu estive olhando para a iowaitpropriedade 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 iowaittempo. 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"?

Alquimista
fonte
3
"Um processo é executado em uma única CPU". Na verdade não. Um encadeamento é executado em um único núcleo da CPU, mas os processos modernos têm vários encadeamentos e as CPUs modernas têm vários núcleos.
MSalters
@MSalters E mesmo assim, enquanto um único encadeamento pode ser executado apenas em um núcleo a qualquer momento, o núcleo em que ele executa pode mudar após a alternância de contexto.
JAB
11
Não há essa coisa chamada de pedido de interrupção (IRQ), mas é talvez mais hardware do que está interessado.
mathreadler

Respostas:

33

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 (desde o Linux 2.5.41)

(5) Tempo aguardando a conclusão da E / S. Este valor não é confiável, pelos seguintes motivos:

  1. A CPU não aguardará a conclusão da E / S; iowaité o tempo que uma tarefa aguarda a conclusão da E / S. Quando uma CPU entra no estado ocioso para E / S de tarefas pendentes, outra tarefa será agendada nessa CPU.

  2. Em uma CPU com vários núcleos, a tarefa que aguarda a conclusão da E / S não está sendo executada em nenhuma CPU, portanto, iowaité difícil calcular a CPU de cada CPU.

  3. O valor neste campo pode diminuir em determinadas condições.

iowaittenta 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_iowaitcampo do task_struct; você pode procurar in_iowaitno 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. A iowaitentrada /proc/stat, que é o que termina top, é incrementada sempre que um tick de timer é contabilizado, e o processo atual de ativação da CPU fica ocioso; você pode ver isso procurando account_idle_timeno 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" ...

Stephen Kitt
fonte