Ich habe die in der iowait
oberen 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 iowait
Zeit 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?
quelle
Antworten:
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
versucht, 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_iowait
Bereich der nachverfolgttask_struct
; Sie könnenin_iowait
im 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. Deriowait
Eintrag in/proc/stat
, in dem endettop
, 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“ ...
quelle