Сколько я ни читал об iowait, для меня это все еще загадка.
Я знаю, что это время, затрачиваемое ЦП на ожидание завершения операций ввода-вывода, но какие именно операции ввода-вывода? Я также не уверен, почему это так важно? Разве ЦП не может сделать что-то еще, пока операция ввода-вывода завершается, а затем вернуться к обработке данных?
Также каковы правильные инструменты для диагностики того, какой процесс (-ы) точно ждал ввода-вывода.
И как можно минимизировать время ожидания ввода-вывода?
Я знаю, что это время, затрачиваемое ЦП на ожидание завершения операций ввода-вывода, но какие именно операции ввода-вывода? Я также не уверен, почему это так важно? Разве ЦП не может сделать что-то еще, пока операция ввода-вывода завершается, а затем вернуться к обработке данных?
Да, операционная система будет планировать запуск других процессов, пока один из них заблокирован при вводе-выводе. Однако внутри этого процесса, если он не использует асинхронный ввод-вывод, он не будет развиваться до тех пор, пока любая операция ввода-вывода не будет завершена.
Также каковы правильные инструменты для диагностики того, какой процесс (-ы) точно ждал ввода-вывода.
Некоторые инструменты, которые могут оказаться полезными
iostat
, чтобы контролировать время обслуживания ваших дисковiotop
(если ваше ядро поддерживает это), чтобы отслеживать разбивку запросов ввода-вывода на процессstrace
, чтобы посмотреть на фактические операции, выполняемые процессомИ как можно минимизировать время ожидания ввода-вывода?
Старый вопрос, недавно возникший, но существующих ответов было недостаточно.
IOWait (обычно обозначается %wa
вверху) - это подкатегория простоя (%idle
обычно выражается как все простаивающие, кроме определенных подкатегорий), что означает, что ЦП ничего не делает. Следовательно, пока есть другой процесс, который ЦП может обрабатывать, он будет это делать. Кроме того, простоя, пользователь, система, iowait и т. Д. Являются мерой по отношению к ЦП. Другими словами, вы можете думать о iowait как о простое, вызванном ожиданием io.
Точнее, iowait - это время, потраченное на получение и обработку аппаратных прерываний, в процентах от тактов процессора. Программные прерывания обычно обозначаются отдельно как %si
.
IOWait важен, потому что часто это ключевой показатель, позволяющий узнать, есть ли у вас узкие места при вводе-выводе. Но отсутствие iowait не обязательно означает, что ваше приложение не узкое место на вводе-выводе. Рассмотрим два приложения, запущенных в системе. Если программа 1 сильно загружена io, а программа 2 интенсивно использует процессор, %user + %system
CPU может быть примерно ~ 100%, и, соответственно, iowait покажет 0. Но это только потому, что программа 2 является интенсивной и, кажется, ничего не говорит о программе 1, потому что все это с точки зрения процессора.
См. Сообщения Дэйва Чейни и Ксеркса.
Но также простой top
покажет в %wa
.
Кроме того, поскольку мы почти вступаем в 2013 год, в дополнение к тому, что говорили другие, доступны просто потрясающие устройства хранения ввода-вывода, а именно SSD. SSD классные !!!
iowait
iowait
время ожидания процессора / процессоров (т.е. состояние простоя и делает ничего), во время которого фактически был невыполненные запросы ввода-вывода диска.
Обычно это означает, что блочные устройства (то есть физические диски, а не память) работают слишком медленно или просто переполнены.
Следовательно, вы должны отметить, что если вы видите высокую среднюю нагрузку в своей системе и при осмотре заметили, что большая часть этого на самом деле связана с ожиданием ввода-вывода, это не обязательно означает, что ваша система в неисправности - и это происходит, когда вы машине просто нечего делать, кроме процессов, связанных с вводом-выводом (т. е. процессов, которые выполняют больше операций ввода-вывода, чем что-либо другое (системные вызовы без привязки к вводу-выводу)). Это также должно быть очевидно из того факта, что все, что вы делаете в системе, по-прежнему очень быстро реагирует.
инструменты
sar
(из sysstat
пакет, доступный на большинстве машин * nix)iostat
sarface
(интерфейс для sar
)Я нашел объяснение и примеры из этой ссылки очень полезными: Что такое «айовейт»?. Кстати, для полноты изложения ввод-вывод здесь относится к вводу-выводу диска, но может также включать ввод-вывод на сетевом диске (таком как nfs), как объяснено в этот другой пост.
Я процитирую несколько важных разделов (на случай, если ссылка отключится), некоторые из них будут повторением того, что уже сказали другие, но для меня, по крайней мере, они были более ясными:
Обобщая это одним предложением, «iowait» - это процент времени, в течение которого ЦП простаивает, И выполняется хотя бы один ввод-вывод.
Каждый ЦП может находиться в одном из четырех состояний: пользователь, sys, idle, iowait.
Мне было интересно, что происходит, когда в системе есть другие процессы, готовые к запуску, в то время как один процесс ожидает ввода-вывода. Ниже это объясняется:
Если ЦП простаивает, ядро затем определяет, есть ли в настоящее время хотя бы один ввод-вывод для локального диска или удаленно смонтированного диска (NFS), который был инициирован этим ЦП. Если есть, то счетчик iowait увеличивается на единицу. Если не выполняется никаких операций ввода-вывода, инициированных этим ЦП, счетчик простоя увеличивается на единицу.
А вот пример:
Допустим, на ЦП запущены две программы. Один из них - программа dd, читающая с диска. Другая - программа, которая не выполняет операций ввода-вывода, но тратит 100% своего времени на выполнение вычислений. Теперь предположим, что существует проблема с подсистемой ввода-вывода и что физический ввод-вывод занимает секунду для завершения. Всякий раз, когда программа 'dd' спит, ожидая завершения операций ввода-вывода, другая программа может работать на этом процессоре. Когда происходит прерывание часов, всегда будет программа, работающая либо в пользовательском, либо в системном режиме. Следовательно, значения% idle и% iowait будут равны 0. Даже если iowait сейчас равен 0, это не означает, что нет проблемы ввода-вывода, потому что, очевидно, она есть, если физические операции ввода-вывода занимают секунду для завершения.
Стоит прочитать полный текст. Вот зеркало этой страницы, в случае выхода из строя.
Для Solaris я использую DTrace, чтобы посмотреть, что делают процессы, если мне нужно увидеть, какие операции ввода-вывода выполняются. Для Linux есть аналогичная программа под названием systemtap что обеспечивает аналогичный уровень доступа к ядру и вызовам процессов.
Один из примеров, который я использовал при изучении DTrace, - это сравнение cp
команда к dd
команда. Ты это видишь dd
делает намного больше чтения для записи, в то время как cp
нет, в основном из-за размера буфера dd
используется по умолчанию (если я правильно помню).
Какие операции ввода-вывода будут зависеть от ваших приложений и настроек.
Это важно, поскольку в некоторых случаях ЦП не может получить данные или инструкции, необходимые для продолжения. В некоторых случаях это может продолжаться, но это будет зависеть от того, какие приложения работают, и что они могут делать. Если у вас есть однопоточное приложение, которое имеет много доступа к диску, вам придется подождать.
Чтобы минимизировать время ввода-вывода, покупайте больше и более быструю память, приобретайте более быстрые диски, дефрагментируйте имеющиеся у вас диски.
Если узким местом является собственное приложение, посмотрите, можно ли его оптимизировать для чтения в больших блоках или для асинхронного ввода-вывода.
с помощью ps aux можно распечатать STAT процесса
если stat - D или Ds, процесс находится в Бесперебойном сне (обычно IO)
когда процесс входит в режим бесперебойного сна, добавляется nr_iowait из очереди выполнения, а если nr_iowait> 0, время простоя процессора считается iowait
vmstat также показывает, сколько блоков процесса
r: количество процессов, ожидающих выполнения.
b: количество процессов в непрерывном сне.
http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/