Bagaimana cara CPU mengetahui ada IO yang tertunda?

17

Saya telah melihat ke dalam iowaitproperti yang ditampilkan dalam output utilitas teratas seperti yang ditunjukkan di bawah ini.

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait secara umum didefinisikan sebagai berikut:

"Ini adalah waktu dimana CPU idle dan ada beberapa IO yang tertunda."

Ini adalah pemahaman saya bahwa suatu proses dijalankan pada satu CPU. Setelah keluar dari jadwal karena menggunakan slot waktu atau setelah diblokir, akhirnya dapat dijadwalkan kembali pada satu CPU lagi.

Dalam kasus permintaan IO, CPU yang membuat proses tidur tanpa gangguan bertanggung jawab untuk melacak iowaitwaktu. CPU lain akan melaporkan waktu yang sama dengan waktu idle pada akhirnya karena mereka benar-benar menganggur. Apakah asumsi ini benar?

Selain itu, dengan asumsi ada permintaan IO yang panjang (artinya proses memiliki beberapa peluang untuk dijadwalkan tetapi tidak dijadwalkan karena IO tidak lengkap), bagaimana CPU tahu ada "pending IO"? Dari mana informasi itu diambil? Bagaimana sebuah CPU dapat mengetahui bahwa beberapa proses ditidurkan beberapa saat untuk diselesaikan oleh IO karena salah satu CPU dapat membuat proses tersebut tertidur. Bagaimana status "IO tertunda" ini dikonfirmasi?

Ahli alkimia
sumber
3
"Suatu proses dijalankan pada satu CPU". Tidak juga. Utas dijalankan pada satu inti CPU, tetapi proses modern memiliki banyak utas dan CPU modern memiliki beberapa inti.
MSalters
@ MSalters Dan bahkan kemudian, sementara satu utas hanya dapat mengeksekusi pada satu inti pada suatu titik waktu inti yang dieksekusi pada dapat berubah setelah konteks beralih.
JAB
1
Ada hal yang disebut permintaan interupsi (IRQ) ini, tetapi mungkin lebih banyak perangkat keras daripada yang kita minati.
mathreadler

Jawaban:

33

CPU tidak tahu semua ini, penjadwal tugas tidak.

Definisi yang Anda kutip agak menyesatkan; procfs(5)manual saat ini memiliki definisi yang lebih akurat, dengan peringatan:

iowait (sejak Linux 2.5.41)

(5) Waktu menunggu I / O selesai. Nilai ini tidak dapat diandalkan, karena alasan berikut:

  1. CPU tidak akan menunggu sampai I / O selesai; iowaitadalah saat tugas menunggu I / O untuk menyelesaikan. Ketika CPU masuk ke kondisi siaga untuk tugas I / O yang luar biasa, tugas lain akan dijadwalkan pada CPU ini.

  2. Pada CPU multi-core, tugas menunggu I / O untuk menyelesaikan tidak berjalan pada CPU apa pun, sehingga iowaitmasing-masing CPU sulit untuk dihitung.

  3. Nilai dalam bidang ini dapat menurun dalam kondisi tertentu.

iowaitmencoba mengukur waktu yang dihabiskan menunggu I / O, secara umum. Itu tidak dilacak oleh CPU tertentu, juga tidak bisa (poin 2 di atas - yang juga cocok dengan apa yang Anda ingin tahu). Ini diukur per CPU, sejauh mungkin.

Penjadwal tugas “tahu” ada I / O yang tertunda, karena tahu bahwa ia menangguhkan tugas yang diberikan karena menunggu I / O. Ini dilacak per tugas di in_iowaitbidang task_struct; Anda dapat mencari in_iowaitdi inti penjadwal untuk melihat bagaimana pengaturannya, dilacak dan dihapus. Artikel terbaru Brendan Gregg tentang Linux memuat rata - rata termasuk informasi latar belakang yang bermanfaat. The iowaitmasuk dalam /proc/stat, yang adalah apa yang berakhir di top, bertambah setiap kali timer tick dicatat, dan proses sedang berlangsung “pada” CPU idle; Anda dapat melihat ini dengan mencari account_idle_timedi kode pelacakan waktu CPU penjadwal .

Jadi definisi yang lebih akurat adalah "waktu yang dihabiskan untuk CPU ini menunggu I / O, ketika tidak ada yang lebih baik untuk dilakukan" ...

Stephen Kitt
sumber