Como uma CPU sabe que há IO pendente?

15

Eu estive pesquisando a propriedade iowait mostrada na saída do utilitário principal, 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á inativa e há alguma IO pendente."

Entendo que um processo é executado em uma única CPU. Depois que ela é desatualizada porque ela esgotou seu horário ou depois de ser bloqueada, ela pode ser programada novamente em qualquer outra CPU.

No caso de solicitação de E / S, uma CPU que coloca um processo em suspensão ininterrupta é responsável por acompanhar o iowait time. As outras CPUs estariam relatando o mesmo tempo que o tempo ocioso no final, pois elas estão realmente inativas. Esta suposição está correta?

Além disso, supondo que haja uma longa solicitação de E / S (significando que o processo teve várias oportunidades de ser agendado, mas não foi agendado porque o IO não estava completo), como uma CPU sabe que há "pedido pendente"? De onde é esse tipo de informação? Como uma CPU pode simplesmente descobrir que algum processo foi colocado em suspensão durante algum tempo para que um IO seja concluído, já que qualquer uma das CPUs poderia ter colocado esse processo em suspensão. Como esse status de "pendente IO" é confirmado?

    
por Alchemist 13.12.2017 / 13:45

1 resposta

32

A CPU não sabe nada disso, o agendador de tarefas faz.

A definição que você cita é um pouco enganosa; a procfs(5) manpage atual tem uma definição mais precisa, com ressalvas:

iowait (since Linux 2.5.41)

(5) Time waiting for I/O to complete. This value is not reliable, for the following reasons:

  1. The CPU will not wait for I/O to complete; iowait is the time that a task is waiting for I/O to complete. When a CPU goes into idle state for outstanding task I/O, another task will be scheduled on this CPU.

  2. On a multi-core CPU, the task waiting for I/O to complete is not running on any CPU, so the iowait of each CPU is difficult to calculate.

  3. The value in this field may decrease in certain conditions.

iowait tenta medir o tempo gasto esperando por E / S, 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). É medida 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 campo in_iowait do task_struct ; você pode procurar in_iowait no núcleo do agendador para ver como ele é definido, rastreado e limpo. O recente artigo de Brendan Gregg sobre as médias de carga do Linux inclui informações básicas úteis. A entrada iowait em /proc/stat , que é o que acaba em top , é incrementada sempre que um tick do timer é contabilizado, e o processo atual “on” na CPU está ocioso; você pode ver isso procurando account_idle_time no código de rastreamento de tempo da CPU do agendador .

Assim, uma definição mais precisa seria "tempo gasto com essa CPU esperando por E / S, quando não havia nada melhor para fazer" ...

    
por 13.12.2017 / 14:00