Кто-нибудь может объяснить точно, что такое IOWait?

194

Столько, сколько я прочитал о Айовите, это все еще загадка для меня.

Я знаю, что это время, потраченное процессором на ожидание завершения операций ввода-вывода, но какой именно тип операций ввода-вывода? В чем я тоже не уверен, почему это так важно? Разве процессор не может просто сделать что-то еще, когда операция ввода-вывода завершится, и затем вернуться к обработке данных?

Кроме того, каковы правильные инструменты для диагностики того, какие процессы действительно ожидают ввода-вывода.

И как можно минимизировать время ожидания ввода-вывода?

Питер Круминьш
источник
А также, что такое высокий айоваит?
Мухамед Хусейнбашич

Ответы:

99

Я знаю, что это время, потраченное процессором на ожидание завершения операций ввода-вывода, но какой именно тип операций ввода-вывода? В чем я тоже не уверен, почему это так важно? Разве процессор не может просто сделать что-то еще, когда операция ввода-вывода завершится, и затем вернуться к обработке данных?

Да, операционная система будет планировать запуск других процессов, пока один из них заблокирован на IO. Однако внутри этого процесса, если он не использует асинхронный ввод-вывод, он не будет выполняться до завершения какой-либо операции ввода-вывода.

Кроме того, каковы правильные инструменты для диагностики того, какие процессы действительно ожидают ввода-вывода.

Некоторые инструменты, которые вы можете найти полезными

  • iostat, чтобы следить за временем обслуживания ваших дисков
  • iotop (если ваше ядро ​​поддерживает это), чтобы отслеживать разбивку запросов ввода-вывода на процесс
  • strace, чтобы посмотреть на фактические операции, выпущенные процессом

И как можно минимизировать время ожидания ввода-вывода?

  • убедитесь, что у вас есть свободная физическая память, чтобы ОС могла кешировать дисковые блоки в памяти
  • держите дисковое пространство файловой системы ниже 80%, чтобы избежать чрезмерной фрагментации
  • настроить вашу файловую систему
  • использовать контроллер массива с батарейным питанием
  • выбирайте хороший размер буфера при выполнении операций ввода-вывода
Дейв Чейни
источник
6
Не забудьте: «Убедитесь, что внутреннее хранилище достаточно быстрое, чтобы справиться с нагрузкой ввода-вывода».
jgoldschrafe
1
@ Дэйв Чейни, и когда мой процесс простаивает, это потому, что он ожидает ввода-вывода. Так в чем же разница между IOWait и холостым ходом?
Ctrl-Alt-Delor
4
В IOwait процесс находится в «непрерывном спящем режиме», что означает, что его нельзя остановить, чтобы избежать риска повреждения данных на дисках. нормальный бездействующий процесс на самом деле ничего не делает, поэтому меньше риска его убить.
mveroone
1
На вершине практически это означает, что ваш ввод-вывод слишком медленный. «Сделайте сервер быстрее» отличается, независимо от того, ограничены ли вы процессором или ваш процессор голодает, потому что кто-то решил, что медленного диска ноутбука достаточно для запуска сервера базы данных, а загрузка IO заставляет процессор использовать только 2% от того, что он может, ожидая, как без ума от IO, чтобы закончить.
TomTom
О боже, я не могу поверить, что первые три ответа здесь настолько неверны . Ответ ниже от haridsv правильный. Никакой процессор не «ждет» завершения ввода-вывода. Да, некоторые io могут блокировать - часто есть веская причина для этого, и при некоторых обстоятельствах все io может блокировать. Но вы также можете увидеть iowait, происходящий для полностью асинхронных операций.
Symcbean
47

Старый вопрос, недавно столкнулся, но чувствовал, что существующих ответов было недостаточно.

IOWait определение и свойства

IOWait (обычно помеченный %waсверху) является подкатегорией бездействия ( %idleобычно выражается как все бездействия, кроме определенных подкатегорий), то есть процессор ничего не делает. Поэтому, пока есть другой процесс, который процессор может обрабатывать, он будет это делать. Кроме того, время простоя, пользователь, система, iowait и т. Д. Являются измерением по отношению к процессору. Другими словами, вы можете думать о iowait как о бездействии, вызванном ожиданием io.

Точно, iowait - это время, потраченное на получение и обработку аппаратных прерываний в процентах от тактов процессора. Программные прерывания обычно помечаются отдельно как %si.

Важность и потенциальное заблуждение

IOWait важен, потому что он часто является ключевым показателем, чтобы узнать, нет ли у вас узких мест в IO. Но отсутствие iowait не обязательно означает, что ваше приложение не является узким местом при IO. Рассмотрим два приложения, работающие в системе. Если программа 1 сильно затруднена, а программа 2 является интенсивным пользователем %user + %systemЦП, загрузка ЦП все равно может составлять ~ 100% и, соответственно, iowait будет показывать 0. Но это только потому, что программа 2 интенсивна и, по-видимому, ничего не говорит о программа 1, потому что все это с точки зрения процессора.

Инструменты для обнаружения IOWait

Смотрите посты Дейва Чейни и Ксеркс

Но и простое topпокажет в %wa.

Сокращение IOWait

Кроме того, поскольку мы сейчас почти вступаем в 2013 год, в дополнение к тому, что говорили другие, доступны недорогие устройства хранения ввода-вывода, а именно SSD. Твердотельные накопители потрясающие !!!

Сердитый
источник
35

iowait

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

Обычно это означает, что блочные устройства (то есть физические диски, а не память) слишком медленные или просто насыщены.

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

инструменты

  • sar(из sysstatпакета, доступного на большинстве машин * nix)
  • iostat
  • sarface(интерфейс к sar)
Ксеркс
источник
7
Обратите внимание, что строго говоря, это определение времени ожидания ввода / вывода действительно только в однопроцессорных системах. Это должно быть несколько улучшено
Андреас Вайтен
В какой степени iowaitвлияет Load Average? Скажем, 100 потоков, ожидающих сети, LA будет 100?
Иван Балашов
32

Я нашел объяснение и примеры по этой ссылке очень полезными: что именно означает «Айоваит»? , Кстати, для полноты, ввод-вывод здесь относится к дисковому вводу-выводу, но может также включать в себя ввод-вывод на подключенном к сети диске (например, nfs), как объяснено в этом другом посте .

Я процитирую несколько важных разделов (в случае, если ссылка не работает), некоторые из них будут повторением того, что уже сказали другие, но мне, по крайней мере, это было более понятно:

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

Каждый процессор может находиться в одном из четырех состояний: пользователь, sys, idle, iowait.

Мне было интересно, что происходит, когда в системе есть другие процессы, готовые к запуску, пока один процесс ожидает ввода-вывода. Ниже это объясняется:

Если процессор простаивает, ядро ​​затем определяет, выполняется ли в настоящее время хотя бы один ввод-вывод на локальном диске или на удаленно смонтированном диске (NFS), который был инициирован с этого процессора. Если есть, то счетчик 'iowait' увеличивается на единицу. Если нет ввода-вывода, который был запущен из этого ЦП, счетчик «ожидания» увеличивается на единицу.

И вот пример:

Допустим, на процессоре работают две программы. Одним из них является чтение программы «dd» с диска. Другая - это программа, которая не выполняет ввод-вывод, но тратит 100% своего времени на вычислительную работу. Теперь предположим, что есть проблема с подсистемой ввода-вывода и что физические операции ввода-вывода занимают секунду, чтобы завершиться. Всякий раз, когда программа dd спит в ожидании завершения ввода-вывода, другая программа может работать на этом процессоре. Когда происходит прерывание часов, всегда будет программа, работающая либо в пользовательском, либо в системном режиме. Таким образом, значения% idle и% iowait будут равны 0. Даже если iowait равен 0, это не означает, что нет проблемы ввода-вывода, потому что, очевидно, существует одна, если физические операции ввода-вывода занимают секунду для завершения.

Полный текст стоит прочитать. Вот зеркало этой страницы , на случай, если оно исчезнет.

оборота харидсв
источник
1

Для Solaris я использую DTrace, чтобы посмотреть, что делают процессы, если мне нужно увидеть, какие операции ввода / вывода выполняются. Для Linux существует аналогичная программа, называемая systemtap, которая обеспечивает аналогичный уровень доступа к ядру и вызовам процессов.

Одним из примеров, который я использовал при изучении DTrace, было сравнение cpкоманды с ddкомандой. Вы можете видеть, что это ddделает намного больше cpопераций чтения для записи, но не делает этого, главным образом из-за размера буфера, ddиспользуемого по умолчанию (если я правильно помню).

Милнер
источник
0

Какие операции ввода-вывода будут зависеть от ваших приложений и настроек.

Это важно, так как в некоторых случаях ЦП не может получить данные или инструкции, необходимые для продолжения. В некоторых случаях это может продолжаться, но это будет зависеть от того, какие приложения работают, и от того, что он может делать. Если у вас есть однопоточное приложение, которое имеет большой доступ к диску, вам придется подождать.

Чтобы минимизировать время ввода-вывода, покупайте больше и быстрее памяти, получайте более быстрые диски, дефрагментируйте имеющиеся у вас диски.

Если это внутреннее приложение, которое является узким местом, посмотрите, можно ли его оптимизировать для чтения большими блоками или для асинхронного ввода-вывода.

Джереми Френч
источник
Итак, iowait - это время, затрачиваемое на блокировку операций ввода-вывода?
Питер Круминьш
Так, например, если я выполняю select () или poll () и он блокируется, то время ожидания, пока дескриптор станет доступным, будет равняться времени iowait?
Питер Круминьш
Я думаю, что это относится к SO, так как это выглядит как вопрос программирования.
Джереми Френч
Петерис - да, это хороший способ думать об этом.
user2278
0

используя пс AUX можно напечатать процесс STAT ,
если стат D или Ds, процесс находится в источник бесперебойного сна (обычно IO) ,
когда процесс входа Источник бесперебойного сна, nr_iowait из runqueue добавляется, а если nr_iowait> 0, то время простоя процессора считается Айоваит

vmstat также показывает, сколько блоков процессов
r: количество процессов, ожидающих выполнения.
б: количество процессов в непрерывном сне.

http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

Синго
источник