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

<p>столько, сколько я прочитал о айовите, это все еще загадка для меня.</p><p>я знаю, что это время, потраченное процессором на ожидание выполнения операций io, но какие именно операции io?) в чем я тоже не уверен, почему это так важно? может ли процессор просто делать что-то еще, пока операция io завершается, а затем возвращается к обработке данных?</p><p>кроме того, каковы правильные инструменты для диагностики того, какие процессы действительно ожидают ввода-вывода.</p><p>и как сократить время ожидания io?)</p>

<blockquote> <p>я знаю, что это время, потраченное процессором на ожидание выполнения операций io, но какие именно операции io?) в чем я тоже не уверен, почему это так важно? может ли процессор просто делать что-то еще, пока операция io завершается, а затем возвращается к обработке данных?</p> </blockquote><p>да, операционная система будет планировать запуск других процессов, пока один из них заблокирован на io. однако внутри этого процесса, если он не использует асинхронный ввод-вывод, он не будет выполняться до тех пор, пока операция io не будет завершена).</p><blockquote> <p>кроме того, каковы правильные инструменты для диагностики того, какие процессы действительно ожидают ввода-вывода.</p> </blockquote><p>некоторые инструменты, которые вы можете найти полезными</p><ul> <li><code>iostat</code>, чтобы контролировать время обслуживания ваших дисков</li> <li><code>iotop</code> (если ваше ядро поддерживает это), чтобы отслеживать разбивку io запросов на процесс</li> <li><code>strace</code>, чтобы посмотреть на фактические операции, выполненные процессом</li> </ul><blockquote> <p>и как сократить время ожидания io?)</p> </blockquote><ul> <li>убедитесь, что у вас есть свободная физическая память, чтобы ос могла кешировать дисковые блоки в памяти</li> <li>держите дисковое пространство файловой системы ниже 80%, чтобы избежать чрезмерной фрагментации</li> <li>настроить вашу файловую систему</li> <li>использовать контроллер массива с батарейным питанием</li> <li>выберите хороший размер буфера при выполнении операций ввода-вывода</li> </ul>

<p>старый вопрос, недавно столкнулся, но чувствовал, что существующих ответов было недостаточно.</p><h1>iowait определение и свойства</h1><p>iowait (обычно с пометкой <code>%wa</code> вверху) это подкатегория простоя (<code>%idle</code> обычно выражается как все бездействующие, кроме определенных подкатегорий), то есть процессор ничего не делает. поэтому, пока есть другой процесс, который процессор может обрабатывать, он будет это делать. кроме того, время простоя, пользователь, система, iowait и т.д. являются измерением по отношению к процессору. другими словами, вы можете думать о iowait как о бездействии, вызванном ожиданием io.</p><p>точно, iowait - это время, потраченное на получение и обработку аппаратных прерываний в процентах от тактов процессора. программные прерывания обычно помечаются отдельно как <code>%si</code>.</p><h2>важность и потенциальное заблуждение</h2><p>iowait важен, потому что он часто является ключевым показателем, чтобы узнать, нет ли у вас узких мест в io. но отсутствие iowait не обязательно означает, что ваше приложение <strong>не</strong> узкое место на io. рассмотрим два приложения, работающие в системе. если программа 1 сильно затруднена, а программа 2 сильно загружена процессором, <code>%user + %system</code> процессора может все еще быть примерно ~ 100% и, соответственно, iowait будет показывать 0. но это только потому, что программа 2 интенсивна и относительно ничего не говорит о программе 1, потому что все это с точки зрения процессора.</p><h1>инструменты для обнаружения iowait</h1><p>смотрите посты дейва чейни и ксеркс</p><p>но также простое <code>top</code> будет отображаться в <code>%wa</code>.</p><h1>сокращение iowait</h1><p>кроме того, поскольку мы сейчас почти вступаем в 2013 год, в дополнение к тому, что говорили другие, доступна опция просто потрясающих io устройств хранения данных, а именно ssd. ssd - это круто !!!</p>

<p><b><code>iowait</code></b></p><p><code>iowait</code> время, которое процессор/процессоры ожидают (то есть находится в состоянии ожидания <em> </em> и делает <em> ничего </em>), во время которого на самом деле <em> было </em> невыполненных запросов дискового ввода-вывода.</p><p>обычно это означает, что блочные устройства (то есть физические диски, а не память) слишком медленные или просто насыщены.</p><p>следовательно, вы должны заметить, что если вы видите среднюю нагрузку в вашей системе и при осмотре заметите, что большая часть этого на самом деле происходит из-за ожидания ввода-вывода, это не обязательно означает, что ваша система испытывает проблемы - и это происходит, когда машине просто нечего делать, кроме процессов, связанных с вводом/выводом (то есть процессов, которые делают больше операций ввода/вывода, чем что-либо еще (системные вызовы, не связанные с вводом/выводом)). это также должно быть видно из того факта, что все, что вы делаете в системе, все еще очень отзывчиво.</p><p><b>инструменты</b></p><ul> <li><code>sar</code> (из пакета <code>sysstat</code>, доступного на большинстве * nix-машин)</li> <li><code>iostat</code></li> <li> <a href="http://projects.autonomy.net.au/sarface"><code>sarface</code></a> (интерфейс <code>sar</code>)</li> </ul>

<p>я нашел объяснение и примеры по этой ссылке очень полезными: <a href="https://blog.pregos.info/wp-content/uploads/2010/09/iowait.txt">что именно означает "iowait"?</a> . кстати, ради полноты, здесь ввод-вывод относится к дисковому вводу-выводу, но может также включать в себя ввод-вывод на подключенном к сети диске (например, nfs), как объяснено в <a href="https://serverfault.com/questions/37441/does-iowait-include-time-waiting-for-network-calls">этот другой пост</a> знак равно.</p><p>я процитирую несколько важных разделов (в случае, если ссылка не работает), некоторые из них будут повторением того, что другие уже сказали, но мне, по крайней мере, это было более понятно:</p><blockquote> <p>подводя итог, можно сказать, что в одном предложении "iowait" - это процент времени, в течение которого центральный процессор не используется, и выполняется хотя бы один ввод-вывод.</p> <p>каждый процессор может находиться в одном из четырех состояний: пользователь, sys, idle, iowait.</p> </blockquote><p>мне было интересно, что происходит, когда в системе есть другие готовые к запуску процессы, в то время как один процесс ожидает ввода-вывода. ниже это объясняется:</p><blockquote> <p>если процессор простаивает, ядро затем определяет, выполняется ли в настоящее время хотя бы один ввод-вывод на локальный диск или диск удаленного подключения (nfs), который был инициирован с этого процессора. если есть, то счетчик 'iowait' увеличивается на единицу. если нет ввода-вывода, который был запущен из этого цп, счетчик "ожидания" увеличивается на единицу.</p> </blockquote><p>и вот пример:</p><blockquote> <p>допустим, на процессоре работают две программы. одним из них является чтение программы "dd" с диска. другая - это программа, которая не выполняет ввод-вывод, но тратит 100% своего времени на вычислительную работу. теперь предположим, что есть проблема с подсистемой ввода-вывода и что физические операции ввода-вывода занимают секунду, чтобы завершиться. всякий раз, когда программа dd спит, ожидая завершения ввода-вывода, другая программа может работать на этом процессоре. когда происходит прерывание часов, всегда будет программа, работающая либо в пользовательском, либо в системном режиме. таким образом, значения% idle и% iowait будут равны 0. даже если iowait равен 0, это не означает, что нет проблемы ввода-вывода, потому что, очевидно, существует одна, если физические операции ввода-вывода занимают секунду для завершения.</p> </blockquote><p>полный текст стоит прочитать. вот <a href="https://gist.github.com/haridsv/0d65d263b7f5f79a73e5">зеркало этой страницы</a> , на случай, если оно выйдет из строя.</p>

<p>для solaris я использую dtrace, чтобы посмотреть, что делают процессы, если мне нужно увидеть, какие операции ввода/вывода выполняются. для linux есть похожая программа под названием <a href="http://sourceware.org/systemtap/">systemtap</a> , которая обеспечивает аналогичный уровень доступа к ядру и вызовам процессов.</p><p>одним из примеров, который я использовал при изучении dtrace, было сравнение команды <code>cp</code> с командой <code>dd</code>. вы можете видеть, что <code>dd</code> выполняет намного больше операций чтения для записи, в то время как <code>cp</code> этого не делает, в основном из-за размера буфера, который <code>dd</code> использует по умолчанию (если я помню, правильно).</p>

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

<p>используя ps aux можно распечатать процесс stat<br> , если stat - d или ds, процесс находится в непрерывном сне (обычно io)<br> когда процесс переходит в непрерывный режим сна, добавляется nr\_iowait очереди выполнения, а если nr\_iowait> 0, время простоя процессора считается в iowait</p><p>vmstat также показывает, сколько блоков процесса<br> r: число процессов, ожидающих выполнения.<br> b: количество процессов в непрерывном сне.</p><p> <a href="http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/">http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/</a> </p>