Чи може хтось точно пояснити, що таке 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час, що процесор / процесори чекають (тобто знаходиться в режимі очікування і нічого не робить ), протягом якого насправді був непогашений запит вводу / виводу диска.

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

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

інструменти

  • sar(з sysstatупаковки, доступної на більшості * 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.