Чи може хтось точно пояснити, що таке IOWait?


194

Скільки я читав про iowait, для мене це все ще таємниця.

Я знаю, що це час, витрачений процесором на очікування завершення операцій IO, але які саме операції IO саме? У чому я також не впевнений, чому це так важливо? Чи не може процесор просто зробити щось інше, поки операція вводу-виводу завершиться, а потім повернутися до обробки даних?

Також які правильні інструменти для діагностики того, який процес точно чекав на IO.

І які способи мінімізувати час очікування виводу?


А також, що таке високий вміст?
Мухаммед Хусейнбашич

Відповіді:


99

Я знаю, що це час, витрачений процесором на очікування завершення операцій IO, але які саме операції IO саме? У чому я також не впевнений, чому це так важливо? Чи не може процесор просто зробити щось інше, поки операція вводу-виводу завершиться, а потім повернутися до обробки даних?

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

Також які правильні інструменти для діагностики того, який процес точно чекав на IO.

Деякі інструменти, які можуть вам бути корисними

  • iostat, для контролю часу обслуговування ваших дисків
  • iotop (якщо ваше ядро ​​підтримує це), щоб контролювати розбиття запитів вводу-виводу за процес
  • strace, щоб переглянути фактичні операції, видані процесом

І які способи мінімізувати час очікування виводу?

  • переконайтеся, що у вас є вільна фізична пам'ять, щоб ОС могла кешувати дискові блоки в пам'яті
  • зберігайте використання дискової файлової системи нижче 80%, щоб уникнути зайвої фрагментації
  • налаштуйте вашу файлову систему
  • використовувати контролер масиву, що підтримується батареєю
  • вибирайте хороші розміри буфера під час виконання операцій io

6
Не забувайте: "переконайтеся, що ваше запасне сховище є достатньо швидким, щоб не відставати від завантаження вводу / виводу".
jgoldschrafe

1
@Dave Cheney, і коли мій процес простоює, це тому, що він чекає на IO. Отже, яка різниця між IOWait і простоєм?
ctrl-alt-delor

4
Перебуваючи в IOwait, процес знаходиться в режимі "безперебійного сну", тобто його неможливо вбити, щоб уникнути ризику пошкодження даних на дисках. нормальний непрацюючий процес насправді нічого не робить, тому менше ризиків його вбити.
mveroone

1
Зверху практично це означає, що ваш IO занадто повільний. "Зробити сервер швидше" - це те, чи обмежений ви процесор, чи голодний процесор, тому що хтось вирішив, що повільний диск ноутбука достатній для запуску сервера баз даних, а завантаження IO змушує CPU використовувати лише 2% того, що він може, чекаючи, як божевільний для закінчення IO.
TomTom

OMG Я не можу повірити, що найкращі 3 відповіді тут так неправильні . Відповідь haridsv наведена нижче. Жоден процесор не "чекає" завершення io. Так, деякий 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. SSD дивовижні !!!


35

iowait

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

Зазвичай це означає, що блокові пристрої (тобто фізичні диски, а не пам'ять) занадто повільні або просто насичені.

Отже, ви повинні зауважити, що якщо ви бачите високу середню завантаженість на вашій системі, а при огляді помічаєте, що більшість цього насправді пов’язана з очікуванням вводу / виводу, це не обов'язково означає, що ваша система перебуває в проблемах - і це відбувається, коли машина просто не має нічого спільного, крім процесів, пов'язаних з входом / виводом (тобто процесів, які роблять більше вводу / виводу, ніж будь-що інше (без викликів, пов'язаних з входом / виводом). Це також повинно бути видно з того, що все, що ви робите в системі, все ще дуже чуйне.

інструменти

  • sarsysstatупаковки, доступної на більшості * nix машин)
  • iostat
  • sarface(передня частина до sar)

7
Зауважимо, що суворо кажучи, що визначення часу очікування вводу / виводу є дійсним лише для систем з однією процесором. Це потрібно дещо вдосконалити для багатопроцесорних систем: veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen

В якій мірі iowaitвпливає Load Average? Скажіть, 100 потоків очікують на мережу, LA буде 100?
Іван Балашов

32

Я знайшов пояснення та приклади з цього посилання дуже корисними: Що саме таке "iowait"? . BTW, для повноти, введення-виведення тут відноситься до дискових вводу-виводу, але також може включати введення-виведення на мережевий диск (наприклад, nfs), як пояснено в цьому іншому дописі .

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

Якщо узагальнити це в одному реченні, "iowait" - це відсоток часу, коли процесор працює в режимі очікування, і щонайменше один ввід / вивід працює.

Кожен процесор може перебувати в одному з чотирьох станів: user, sys, idle, iowait.

Мені було цікаво, що відбувається, коли система має інші процеси, готові запуститися, поки один процес чекає вводу / виводу. Нижче пояснюється це:

Якщо процесор працює в режимі очікування, то ядро ​​визначає, чи є принаймні один ввід / вивід, який наразі виконується, або локальному диску, або дистанційно встановленому диску (NFS), який був ініційований із цього процесора. Якщо є, то лічильник 'iowait' збільшується на одиницю. Якщо в процесі вводу-виводу немає ініціатора, який був ініційований із цього процесора, лічильник "простою" збільшується на одиницю.

І ось приклад:

Скажімо, що на ЦП працює дві програми. Один - програма зчитування з диска. Інша - програма, яка не робить вводу-виводу, але витрачає 100% свого часу на обчислювальну роботу. Тепер припустимо, що існує проблема з підсистемою вводу-виводу і що фізичні введення-виведення потребують секунди для завершення. Щоразу, коли програма 'dd' спить, очікуючи завершення вводу-виводу, інша програма може працювати на цьому процесорі. Коли відбувається переривання годинника, програма завжди буде працювати в режимі користувача або в режимі системи. Тому значення% idle та% iowait будуть 0. Хоча iowait зараз 0, це не означає, що НЕ існує проблеми вводу / виводу, оскільки, очевидно, є одна, якщо фізичні введення-виведення приймають секунду для завершення.

Повний текст варто прочитати. Ось дзеркало цієї сторінки , якщо вона знизиться.


1

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

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


0

Яка операція вводу-виводу залежить від ваших програм та налаштувань.

Це важливо, оскільки в деяких випадках процесор не може отримати дані або інструкції, які йому потрібно продовжувати. У деяких випадках це може тривати, але це залежатиме від того, які програми запущені, що вони можуть робити. Якщо у вас є однопотокове додаток, яке дозволяє отримати доступ до диска, тоді вам доведеться почекати.

Щоб мінімізувати час вводу-виводу, купуйте більше та швидшу пам’ять, отримуйте швидші диски, дефрагментуйте наявні у вас диски.

Якщо це внутрішнє додаток, яке є вузьким місцем, подивіться, чи можна оптимізувати його для читання у більших блоках або робити асинхронно IO.


Гаразд, так що iowait - це час, витрачений на блокування операцій вводу- виводу?
Петро Крумінс

Так, наприклад, якщо я вибираю () або опитую () і блокує, то час очікування, поки дескриптор стане доступним, буде складати час очікування?
Петро Крумінс

Я думаю, що це належить до SO, оскільки це виглядає як питання програмування.
Джеремі Френч

Петерис - так, це хороший спосіб подумати про це.
користувач2278

0

використовуючи ps aux, можна надрукувати процес STAT,
якщо stat D або Ds, процес знаходиться у режимі безперебійного сну (зазвичай IO),
коли процес переходить у режим безперебійного сну, додається nr_iowait бігової черги, а якщо nr_iowait> 0, час обертання простою процесора рахується іовати

vmstat також показує, скільки процесорних блоків
r: кількість процесів, які чекають часу запуску.
б: Кількість процесів у режимі безперебійного сну.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.