Come fa una CPU a sapere che c'è IO in sospeso?


17

Ho esaminato la iowaitproprietà mostrata nell'output dell'utilità principale come mostrato di seguito.

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 è generalmente definito come segue:

"È il tempo durante il quale la CPU è inattiva e c'è un certo IO in sospeso."

Comprendo che un processo viene eseguito su una singola CPU. Dopo che è stato pianificato o perché ha esaurito la sua fascia oraria o dopo che è stato bloccato, può eventualmente essere riprogrammato su qualsiasi CPU.

In caso di richiesta IO, una CPU che mette un processo in modalità di sospensione ininterrotta è responsabile del monitoraggio del iowaittempo. Le altre CPU segnalerebbero contemporaneamente il tempo di inattività in quanto sono inattive. Questo assunto è corretto?

Inoltre, supponendo che vi sia una lunga richiesta di IO (il che significa che il processo ha avuto diverse opportunità di essere programmato ma non è stato pianificato perché l'IO non era completo), come fa una CPU a sapere che c'è "IO in sospeso"? Da dove viene recuperato quel tipo di informazioni? In che modo una CPU può semplicemente scoprire che un certo processo è stato messo in pausa un po 'di tempo per il completamento di un IO poiché una delle CPU avrebbe potuto mettere in pausa quel processo. Come viene confermato questo stato di "IO in sospeso"?


3
"Un processo viene eseguito su una singola CPU". Non proprio. Un thread viene eseguito su un singolo core della CPU, ma i processi moderni hanno più thread e quelli moderni hanno più core.
MSalters,

@MSalters E anche allora, mentre un singolo thread può essere eseguito su un solo core in qualsiasi momento, il core su cui viene eseguito può cambiare dopo il cambio di contesto.
JAB

1
C'è questa cosa chiamata richiesta di interruzione (IRQ) ma è forse più hardware di quello a cui siamo interessati.
Mathathler,

Risposte:


33

La CPU non sa nulla di tutto ciò, l'utilità di pianificazione lo sa.

La definizione che citi è in qualche modo fuorviante; l'attuale procfs(5)manpage ha una definizione più accurata, con avvertenze:

iowait (da Linux 2.5.41)

(5) Tempo di attesa per il completamento dell'I / O. Questo valore non è affidabile, per i seguenti motivi:

  1. La CPU non attenderà il completamento dell'I / O; iowaitè il tempo in cui un'attività è in attesa del completamento dell'I / O. Quando una CPU passa allo stato inattivo per l'I / O di attività in sospeso, un'altra CPU verrà pianificata su questa CPU.

  2. Su una CPU multi-core, l'attività in attesa del completamento dell'I / O non è in esecuzione su nessuna CPU, pertanto iowaitè difficile calcolare ciascuna di ciascuna CPU.

  3. Il valore in questo campo può diminuire in determinate condizioni.

iowaittenta di misurare il tempo trascorso in attesa di I / O, in generale. Non è monitorato da una CPU specifica, né può esserlo (punto 2 sopra - che corrisponde anche a ciò che ti stai chiedendo). Tuttavia, viene misurato per CPU, per quanto possibile.

L'utilità di pianificazione "sa" che vi è I / O in sospeso, perché sa che ha sospeso una determinata attività perché è in attesa di I / O. Questo viene tracciato per attività nel in_iowaitcampo di task_struct; puoi cercare in_iowaitnel core dello scheduler per vedere come viene impostato, tracciato e cancellato. Il recente articolo di Brendan Gregg sulle medie di carico di Linux include utili informazioni di base. La iowaitvoce in /proc/stat, che è ciò che finisce top, viene incrementata ogni volta che viene conteggiato un segno di spunta del timer e il processo corrente "acceso" la CPU è inattiva; puoi vederlo cercando account_idle_timenel codice di tracciamento del tempo della CPU del programmatore .

Quindi una definizione più accurata sarebbe "tempo trascorso su questa CPU in attesa di I / O, quando non c'era niente di meglio da fare" ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.