Как процессор узнает, что ожидается IO?


17

Я искал iowaitсвойство, показанное в выводе верхней утилиты, как показано ниже.

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 обычно определяется следующим образом:

«Это время, в течение которого процессор простаивает и ожидается некоторое количество операций ввода-вывода».

Насколько я понимаю, процесс выполняется на одном процессоре. После того, как он был перенесен из-за того, что он использовал свой временной интервал, или после того, как он был заблокирован, он может быть снова запланирован снова на любом одном процессоре.

В случае запроса ввода-вывода процессор, который переводит процесс в непрерывный режим сна, отвечает за отслеживание iowaitвремени. Другие процессоры будут сообщать о времени простоя на своем конце, поскольку они действительно простаивают. Это предположение верно?

Кроме того, предполагая, что существует длинный запрос ввода-вывода (то есть процесс имел несколько возможностей для планирования, но не был запланирован, потому что ввод-вывод не был завершен), как процессор узнает, что существует «ожидающий ввод-вывод»? Откуда взята такая информация? Как процессор может просто обнаружить, что какой-то процесс был приостановлен на некоторое время для завершения ввода-вывода, поскольку любой из процессоров мог бы перевести этот процесс в спящий режим. Как подтверждается этот статус «ожидающий IO»?


3
Msgstr "Процесс запущен на одном процессоре". На самом деле, нет. Поток выполняется на одном ядре ЦП, но современные процессы имеют несколько потоков, а современные ЦП имеют несколько ядер.
MSalters

@MSalters И даже тогда, хотя один поток может выполняться только на одном ядре в любой момент времени, ядро, на котором он выполняется, может измениться после переключения контекста.
JAB

1
Есть такая вещь, как запрос прерывания (IRQ), но она может быть более аппаратной, чем нам интересно.
mathreadler

Ответы:


33

Процессор не знает ничего из этого, планировщик задач знает.

Определение, которое вы цитируете, несколько вводит в заблуждение; текущая procfs(5)man-страница имеет более точное определение с предостережениями:

iowait (начиная с Linux 2.5.41)

(5) Время ожидания завершения ввода-вывода. Это значение ненадежно по следующим причинам:

  1. Процессор не будет ждать завершения ввода-вывода; iowaitвремя, когда задача ожидает завершения ввода-вывода. Когда процессор переходит в состояние ожидания для ввода-вывода невыполненной задачи, на этом процессоре будет запланирована другая задача.

  2. На многоядерном процессоре задача, ожидающая завершения ввода-вывода, не выполняется ни на одном процессоре, поэтому iowaitсложно рассчитать каждый процессор.

  3. Значение в этом поле может уменьшаться в определенных условиях.

iowaitпытается измерить время, потраченное на ожидание ввода / вывода, в общем. Это не отслеживается с помощью конкретного процессора, и не может быть (пункт 2 выше - что также соответствует тому , что вас интересует). Это измеряется на процессор, хотя, насколько это возможно.

Планировщик задач «знает», что существует ожидающий ввод-вывод, потому что он знает, что приостановил заданную задачу, потому что он ожидает ввода-вывода. Это отслеживается для каждой задачи в in_iowaitобласти task_struct; вы можете искать in_iowaitв ядре планировщика, чтобы увидеть, как он установлен, отслеживается и очищается. Недавняя статья Брендана Грегга о средних значениях нагрузки для Linux содержит полезную справочную информацию. iowaitЗапись в /proc/stat, которая является то , что в конце концов в top, увеличивается всякий раз , когда клещ таймер учитывается и текущий процесс «на» CPU находится в режиме ожидания; Вы можете убедиться в этом, посмотрев код отслеживания времени процессораaccount_idle_time в планировщике .

Таким образом, более точное определение было бы «время, потраченное на этот процессор, ожидая ввода-вывода, когда не было ничего лучше» ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.