Woher weiß eine CPU, dass ein E / A-Vorgang ansteht?

17

Ich habe die in der iowaitoberen Ausgabe des Dienstprogramms gezeigte Eigenschaft untersucht, wie unten gezeigt.

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 ist allgemein wie folgt definiert:

"Es ist die Zeit, in der die CPU im Leerlauf ist und einige E / A-Vorgänge anstehen."

Nach meinem Verständnis wird ein Prozess auf einer einzelnen CPU ausgeführt. Nachdem die Planung aufgehoben wurde, entweder weil das Zeitfenster aufgebraucht ist oder nachdem es blockiert wurde, kann es eventuell erneut auf einer beliebigen CPU geplant werden.

Bei einer E / A-Anforderung ist eine CPU, die einen Prozess in den unterbrechungsfreien Ruhezustand versetzt, für die Verfolgung der iowaitZeit verantwortlich. Die anderen CPUs melden an ihrem Ende die gleiche Zeit wie die Leerlaufzeit, da sie wirklich im Leerlauf sind. Ist diese Annahme richtig?

Angenommen, es liegt eine lange E / A-Anforderung vor (dh der Prozess hatte mehrere Möglichkeiten, geplant zu werden, wurde aber nicht geplant, weil die E / A nicht abgeschlossen war). Woher weiß eine CPU, dass es "anstehende E / A" gibt? Woher werden diese Informationen bezogen? Wie kann eine CPU einfach herausfinden, dass ein Prozess einige Zeit in den Ruhezustand versetzt wurde, damit ein E / A-Vorgang abgeschlossen werden kann, da jeder der CPUs diesen Prozess in den Ruhezustand versetzt haben könnte? Wie wird dieser Status von "Pending IO" bestätigt?

Alchimist
quelle
3
Msgstr "Ein Prozess wird auf einer einzelnen CPU ausgeführt". Nicht wirklich. Ein Thread wird auf einem einzelnen CPU-Kern ausgeführt, aber moderne Prozesse haben mehrere Threads und moderne CPUs haben mehrere Kerne.
MSalters
@MSalters Und selbst dann, wenn ein einzelner Thread zu einem Zeitpunkt nur auf einem Kern ausgeführt werden kann, kann sich der Kern, auf dem er ausgeführt wird, nach einem Kontextwechsel ändern.
JAB
1
Es gibt dieses Ding namens Interrupt Request (IRQ), aber es ist vielleicht mehr Hardware, als wir interessiert sind.
Kathreadler

Antworten:

33

Die CPU weiß nichts davon, der Taskplaner.

Die Definition, die Sie zitieren, ist etwas irreführend. Die aktuelle procfs(5)Manpage hat eine genauere Definition, mit Vorbehalten:

iowait (seit Linux 2.5.41)

(5) Wartezeit für den Abschluss der E / A. Dieser Wert ist aus folgenden Gründen nicht zuverlässig:

  1. Die CPU wartet nicht auf den Abschluss der E / A. iowaitist die Zeit, die eine Task auf den Abschluss der E / A wartet. Wenn eine CPU für ausstehende Task-E / A in den Ruhezustand wechselt, wird auf dieser CPU ein weiterer Task geplant.

  2. Auf einer Multi-Core-CPU wird der Task, der auf den Abschluss der E / A wartet, auf keiner CPU ausgeführt, sodass die iowaitBerechnung der einzelnen CPUs schwierig ist.

  3. Der Wert in diesem Feld kann unter bestimmten Umständen abnehmen.

iowaitversucht, die Wartezeit auf E / A im Allgemeinen zu messen. Es wird nicht von einer bestimmten CPU verfolgt und kann es auch nicht sein (Punkt 2 oben - was auch mit dem übereinstimmt, worüber Sie sich wundern). Es wird jedoch so weit wie möglich pro CPU gemessen .

Der Taskplaner „weiß“, dass E / A ansteht, da er weiß, dass er eine bestimmte Task angehalten hat, weil er auf E / A wartet. Dies wird pro Aufgabe im in_iowaitBereich der nachverfolgt task_struct; Sie können in_iowaitim Scheduler-Core nachsehen , wie er festgelegt, verfolgt und gelöscht wird. Brendan Greggs jüngster Artikel zu Linux Load Average enthält nützliche Hintergrundinformationen. Der iowaitEintrag in /proc/stat, in dem endet top, wird immer dann erhöht, wenn ein Zeitgeber-Tick berücksichtigt wird und der aktuelle Prozess in der CPU im Leerlauf ist. Dies können Sie im CPU-Zeiterfassungscodeaccount_idle_time des Schedulers nachlesen .

Eine genauere Definition wäre also, „Zeit auf dieser CPU zu verbringen, die auf E / A wartet, wenn es nichts Besseres zu tun gibt“ ...

Stephen Kitt
quelle