Adakah yang bisa menjelaskan dengan tepat apa itu IOWait?

194

Sebanyak yang saya baca tentang iowait, itu masih merupakan misteri bagi saya.

Saya tahu ini adalah waktu yang dihabiskan oleh CPU untuk menunggu operasi IO selesai, tetapi operasi IO seperti apa tepatnya? Yang saya juga tidak yakin, mengapa itu penting? Tidak bisakah CPU melakukan sesuatu yang lain saat operasi IO selesai, dan kemudian kembali memproses data?

Juga alat apa yang tepat untuk mendiagnosis proses apa yang sebenarnya menunggu IO.

Dan apa cara untuk meminimalkan waktu tunggu IO?

Peter Krumins
sumber
Dan juga, apa iowait tinggi?
Muhamed Huseinbašić

Jawaban:

99

Saya tahu ini adalah waktu yang dihabiskan oleh CPU untuk menunggu operasi IO selesai, tetapi operasi IO seperti apa tepatnya? Yang saya juga tidak yakin, mengapa itu penting? Tidak bisakah CPU melakukan sesuatu yang lain saat operasi IO selesai, dan kemudian kembali memproses data?

Ya, sistem operasi akan menjadwalkan proses lain untuk dijalankan saat satu diblokir di IO. Namun di dalam proses itu, kecuali jika menggunakan asynchronous IO, itu tidak akan berlanjut sampai apapun operasi IO selesai.

Juga alat apa yang tepat untuk mendiagnosis proses apa yang sebenarnya menunggu IO.

Beberapa alat yang menurut Anda berguna

  • iostat, untuk memantau waktu servis disk Anda
  • iotop (jika kernel Anda mendukungnya), untuk memantau rincian permintaan IO per proses
  • strace, untuk melihat operasi aktual yang dikeluarkan oleh suatu proses

Dan apa cara untuk meminimalkan waktu tunggu IO?

  • memastikan Anda memiliki memori fisik gratis sehingga OS dapat men-cache blok disk di memori
  • pertahankan penggunaan disk sistem file Anda di bawah 80% untuk menghindari fragmentasi yang berlebihan
  • tune sistem file Anda
  • menggunakan pengontrol array yang didukung baterai
  • pilih ukuran buffer yang baik saat melakukan operasi io
Dave Cheney
sumber
6
Jangan lupa "pastikan penyimpanan backend Anda cukup cepat untuk mengikuti beban I / O Anda."
jgoldschrafe
1
@ Dave Cheney, Dan ketika proses saya idle itu karena menunggu di IO. Jadi apa perbedaan antara IOWait dan idle?
ctrl-alt-delor
4
Ketika di IOwait, prosesnya berada dalam "sleep yang tidak terputus" yang berarti tidak dapat dimatikan, untuk menghindari risiko data yang rusak pada disk. proses normal menganggur benar-benar tidak melakukan apa-apa, sehingga ada risiko yang lebih kecil untuk membunuhnya.
mveroone
1
Di atas praktis itu berarti IO Anda terlalu lambat. "Jadikan server lebih cepat" berbeda apakah CPU Anda terbatas atau CPU Anda kelaparan karena seseorang memutuskan disk notebook yang lambat sudah cukup untuk menjalankan server database dan beban IO membuat CPU hanya menggunakan 2% dari apa yang bisa, menunggu seperti gila untuk IO selesai.
TomTom
OMG Saya tidak percaya 3 jawaban teratas di sini sangat salah . Jawaban di bawah oleh haridsv benar. Tidak ada cpu yang "menunggu" untuk io selesai. Ya, beberapa io dapat memblokir - seringkali ada alasan yang bagus untuk ini, dan dalam beberapa keadaan semua io dapat memblokir. Tetapi Anda juga dapat melihat iowait terjadi untuk operasi yang sepenuhnya tidak sinkron.
symcbean
47

Pertanyaan lama, baru-baru ini bertemu, tetapi merasa jawaban yang ada tidak mencukupi.

IOWTunggu definisi & properti

IOWait (biasanya diberi label %wadi atas) adalah sub-kategori idle ( %idlebiasanya dinyatakan sebagai semua idle kecuali subkategori yang ditentukan), artinya CPU tidak melakukan apa-apa. Oleh karena itu, selama ada proses lain yang dapat diproses CPU, ia akan melakukannya. Selain itu, idle, pengguna, sistem, iowait, dll adalah ukuran sehubungan dengan CPU. Dengan kata lain, Anda dapat menganggap iowait sebagai idle yang disebabkan oleh menunggu io.

Tepatnya, iowait adalah waktu yang dihabiskan untuk menerima dan menangani interupsi perangkat keras sebagai persentase kutu prosesor. Interupsi perangkat lunak biasanya dinyalakan secara terpisah %si.

Pentingnya & Kesalahpahaman potensial

IOWait penting karena sering merupakan metrik utama untuk mengetahui apakah Anda mengalami hambatan pada IO. Tapi absennya iowait tidak berarti aplikasi Anda tidak mengalami hambatan pada IO. Pertimbangkan dua aplikasi yang berjalan pada suatu sistem. Jika program 1 sangat macet dan program 2 adalah pengguna CPU yang berat, %user + %systemCPU mungkin masih sekitar ~ 100% dan sesuai dengan itu, iowait akan menunjukkan 0. Tapi itu hanya karena program 2 intensif dan relatif tidak mengatakan apa-apa tentang Program 1 karena semua ini dari sudut pandang CPU.

Alat untuk Mendeteksi IOWTunggu

Lihat posting oleh Dave Cheney dan Xerxes

Tetapi juga topakan ditampilkan sederhana %wa.

Mengurangi IOWTait

Juga, karena kita sekarang hampir memasuki tahun 2013, di samping apa yang orang lain katakan, pilihan perangkat penyimpanan IO yang cukup terjangkau, yaitu SSD. SSD luar biasa !!!

Pemarah
sumber
35

iowait

iowaitadalah saat prosesor / prosesor menunggu (yaitu dalam kondisi siaga dan tidak melakukan apa - apa ), di mana sebenarnya ada permintaan I / O disk yang luar biasa.

Ini biasanya berarti bahwa perangkat blok (yaitu disk fisik, bukan memori) terlalu lambat, atau hanya jenuh.

Karena itu Anda harus mencatat bahwa jika Anda melihat rata-rata beban tinggi pada sistem Anda, dan pada pemberitahuan inspeksi bahwa sebagian besar ini sebenarnya disebabkan oleh menunggu I / O, itu tidak berarti bahwa sistem Anda dalam masalah - dan ini terjadi ketika Anda mesin tidak ada hubungannya, selain dari proses yang terikat I / O (yaitu proses yang melakukan lebih banyak I / O daripada yang lainnya (panggilan sistem yang tidak terikat I / O)). Itu juga harus jelas dari kenyataan bahwa apa pun yang Anda lakukan pada sistem masih sangat responsif.

alat

  • sar(dari sysstatpaket, tersedia di sebagian besar * mesin nix)
  • iostat
  • sarface(ujung depan ke sar)
Xerxes
sumber
7
Perhatikan bahwa secara tegas, definisi waktu tunggu I / O hanya valid pada sistem prosesor tunggal. Ini perlu disempurnakan untuk sistem multi-prosesor: veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen
Sejauh mana iowaitpengaruhnya Load Average? Katakanlah, 100 utas menunggu jaringan, akankah LA menjadi 100?
Ivan Balashov
32

Saya menemukan penjelasan dan contoh-contoh dari tautan ini sangat berguna: Apa sebenarnya "iowait"? . BTW, demi kelengkapan, I / O di sini merujuk ke disk I / O, tetapi juga bisa menyertakan I / O pada disk yang dipasang jaringan (seperti nfs), seperti yang dijelaskan dalam posting lain ini .

Saya akan mengutip beberapa bagian penting (jika tautannya mati), beberapa di antaranya akan menjadi pengulangan dari apa yang telah dikatakan orang lain, tetapi bagi saya setidaknya ini lebih jelas:

Untuk meringkasnya dalam satu kalimat, 'iowait' adalah persentase waktu CPU menganggur DAN setidaknya ada satu I / O yang sedang berlangsung.

Setiap CPU dapat berada di salah satu dari empat negara: pengguna, sys, idle, iowait.

Saya bertanya-tanya apa yang terjadi ketika sistem memiliki proses lain yang siap dijalankan sementara satu proses sedang menunggu I / O. Di bawah ini menjelaskannya:

Jika CPU idle, kernel kemudian menentukan apakah ada setidaknya satu I / O saat ini sedang dalam proses untuk disk lokal atau disk yang dipasang dari jarak jauh (NFS) yang telah dimulai dari CPU itu. Jika ada, maka penghitung 'iowait' bertambah satu. Jika tidak ada I / O dalam proses yang dimulai dari CPU itu, penghitung 'idle' bertambah satu.

Dan ini sebuah contoh:

Katakanlah ada dua program yang berjalan pada CPU. Salah satunya adalah program 'dd' membaca dari disk. Yang lain adalah program yang tidak I / O tetapi menghabiskan 100% waktunya untuk melakukan pekerjaan komputasi. Sekarang asumsikan bahwa ada masalah dengan subsistem I / O dan bahwa I / O fisik mengambil alih satu detik untuk menyelesaikan. Setiap kali program 'dd' tertidur sambil menunggu I / O-nya selesai, program lain dapat berjalan pada CPU itu. Ketika interupsi jam terjadi, akan selalu ada program yang berjalan dalam mode pengguna atau mode sistem. Oleh karena itu, nilai% idle dan% iowait akan menjadi 0. Meskipun iowait adalah 0 sekarang, itu tidak berarti TIDAK ada masalah I / O karena jelas ada satu jika I / O fisik mengambil alih satu detik untuk selesai.

Teks lengkapnya layak dibaca. Ini adalah cermin dari halaman ini , kalau-kalau turun.

haridsv
sumber
1

Untuk Solaris, saya menggunakan DTrace untuk melihat apa yang dilakukan proses-proses tersebut jika saya perlu melihat operasi I / O yang sedang berjalan. Untuk Linux, ada program serupa yang disebut systemtap yang menyediakan tingkat eksposur yang mirip dengan kernel dan proses panggilan.

Salah satu contoh yang saya gunakan ketika mempelajari DTrace adalah membandingkan cpperintah ke ddperintah. Anda dapat melihat bahwa ddlebih banyak membaca untuk penulisan, sementara cptidak, sebagian besar karena ukuran buffer ddmenggunakan secara default (jika saya mengingat dengan benar).

Milner
sumber
0

Operasi IO macam apa yang akan tergantung pada aplikasi dan pengaturan Anda.

Ini penting karena dalam beberapa kasus CPU tidak bisa mendapatkan data atau instruksi yang diperlukan untuk melanjutkan. Dalam beberapa kasus ini dapat berlanjut, tetapi itu akan tergantung pada aplikasi apa yang berjalan seperti apa yang dapat dilakukan. Jika Anda memiliki aplikasi berulir tunggal yang melakukan banyak akses disk, Anda harus menunggu.

Untuk meminimalkan waktu IO, beli lebih banyak dan lebih cepat memori, dapatkan disk lebih cepat, defrag disk yang Anda miliki.

Jika ini adalah aplikasi in-house yang merupakan hambatan lihat apakah itu dapat dioptimalkan untuk membaca dalam blok yang lebih besar atau untuk melakukan IO secara tidak sinkron.

Jeremy French
sumber
Oke, jadi iowait adalah waktu yang dihabiskan dalam operasi memblokir IO?
Peter Krumins
Jadi misalnya, jika saya melakukan pilih () atau polling () dan memblokir, maka waktu menunggu hingga deskriptor tersedia akan merupakan waktu iowait?
Peter Krumins
Saya pikir itu akan menjadi milik SO karena terlihat seperti pertanyaan pemrograman.
Jeremy French
Peteris - ya, itu cara yang baik untuk memikirkannya.
user2278
0

menggunakan ps aux dapat mencetak proses STAT
jika stat adalah D atau Ds, prosesnya dalam Uninterruptible sleep (biasanya IO)
ketika suatu proses memasukkan Uninterruptible sleep, nr_iowait dari runqueue ditambahkan, dan jika nr_iowait> 0, waktu idle cpu dihitung untuk iowait

vmstat juga menunjukkan berapa banyak blok proses
r: Jumlah proses yang menunggu waktu berjalan.
b: Jumlah proses dalam tidur yang tidak terputus.

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

Singo
sumber