2016-04-22 8 views
2

heute hatte ich ein Linux-System mit 100% warten in der VMATAT warten Spalte.vmstat: Was genau bedeutet CPU warten?

Meine Frage hier ist: Was macht ein Prozessor genau, wenn er auf I/O wartet?

Zu meinem Verständnis kann eine CPU nicht wirklich warten - es muss etwas Code laufen! Also läuft es etwas eng "warten bis der Disketten-Interrupt kommt" -Code? Warum führt es keinen anderen Code aus und kehrt zurück, wenn der Interrupt von der Festplatte eintrifft?

Meiner Erfahrung nach ist eine Platte so langsam, dass eine CPU viele, viele Zyklen machen kann, bis die Platte fertig ist.

Warum lässt Linux die CPU warten, bis die I/O fertig ist, anstatt etwas Arbeit zu tun?

Thomas

Antwort

2

IO Warte passiert, wenn ein Prozess in ‚uninterruptible'-Staaten ist, während für das IO-Gerät wartet.

Ein Prozess ist "unterbrechungsfrei", wenn er derzeit bestimmte Systemaufrufe ausführt - ein normaler read Warten auf eine Disc wird nicht zu IO-Warte führen, denke ich - das würde zu einem fehlerhaften Verhalten führen Anwendung oder möglicher Datenverlust, wenn der Prozess unterbrochen werden sollte (z. B. durch Einschränkungen des Treibers für den Zugriff auf spezielle Hardware).

Nach dem Durchsuchen des Webs nach z.B. ‚Linux-Kernel unterbrechungsfreien Schlaf erklärt‘

0

ich die Antwort hier gefunden habe: http://veithen.github.io/2013/11/18/iowait-linux.html

So „Warten auf I/O“ auf einem Prozessorebene bedeutet: Der Prozessor nichts tut, als für mich warten/O . Während auf E/A gewartet wird, kann der Prozessor einen Benutzercode ausführen. In diesem Fall verschwindet das Warten auf E/A und die CPU% steigt.

Hier der Testfall von der verlinkten Seite. nur eine Aufgabe ausführen, die auf der ersten CPU viel I/O tut:

taskset 1 dd if =/dev/sda of =/dev/null bs = 1MB

Sie, dass die ersten sehen Die CPU führt nun entweder den Kernel-Code (sy) aus oder wartet auf E/A (wa):

% Cpu0: 0,0 us, 2,9 sy, 0,0 ni, 0,0 ID, 97,1 wa, 0,0 hi, 0,0 s, 0,0 st

Jetzt beginnen wir eine enge CPU-Schleife auf der gleichen CPU:

taskset 1 sh -c „while true; tun true; d ein "

Und-schauen Sie sich das an - die I/O-Warte ist weg, weil die CPU jetzt etwas anderes zu tun hat, als auf I/O zu warten - es läuft Userland-Code!

% cpu0: 91,3 us, 1,3 sy, 0,0 ni, 0,0-ID, 0.0 wa, 0,0 hallo, 7,3 Si, 0,0 st

Hoffnung, dass jemand anderes hilft!

Grettings,

Thomas