Beinhaltet iowait die Wartezeit für Netzwerkanrufe?

Beinhaltet iowait die Wartezeit für Netzwerkanrufe?

Die proc(5)Manpage beschreibt iowait als "Zeit, die auf den Abschluss der IO gewartet wird". Dies wargrößtenteils erklärtin einer früheren Frage. Meine Frage ist: Beinhaltet das Warten auf blockierende IO das Warten auf blockierende Netzwerk-IO oder nur auf lokale IO?

Antwort1

Dies bedeutet, dass auf „Datei-E/A“ gewartet wird, das heißt auf alle Lese-/Schreibaufrufe für eine Datei, die sich im gemounteten Dateisystem befindet. Es zählt aber wahrscheinlich auch die Wartezeit für das Auslagern oder Laden von Seiten in den Speicher, z. B. Bibliotheken, die sich noch nicht im Speicher befinden, oder Seiten mit mmap()-Dateien, die sich nicht im RAM befinden.

Die Wartezeit für IPC-Objekte wie Sockets, Pipes, TTYs, select(), poll(), sleep(), pause() usw. wird NICHT gezählt.

Im Grunde handelt es sich dabei um die Zeit, die ein Thread mit Warten auf synchronen Disc-IO verbringt. Während dieser Zeit könnte er theoretisch ausgeführt werden, kann dies aber nicht, weil einige benötigte Daten noch nicht vorhanden sind. Solche Prozesse werden normalerweise im Status „D“ angezeigt und tragen zur durchschnittlichen Auslastung einer Box bei.

Verwirrenderweise glaube ich, dass dies wahrscheinlich auch die Datei-E/A auf Netzwerkdateisystemen umfasst.

Antwort2

Die iowait-Zeit ist die Zeit, die ein Prozess im Kernel-E/A-Scheduler verbringt. Soweit ich weiß, hat dies nichts mit Netzwerk-E/A zu tun, soweit es um normale Socket-Verbindungen geht. Es umfasst jedoch die Wartezeit für Netzwerkdateisysteme wie NFS.

Antwort3

Es tut.

Übrigens weist einer der von mir verwalteten Server eine hohe Iowait-Zeit auf, die durch eine fehlerhafte NFS-Einbindung verursacht wird.

top - 06:19:03 up 14 days, 10:15,  3 users,  load average: 9.67, 11.83, 12.31
Tasks: 135 total,   1 running, 134 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.2%sy,  0.0%ni,  0.0%id, 99.7%wa,  0.0%hi,  0.0%si,  0.0%st

top - 06:22:55 up 14 days, 10:19,  3 users,  load average: 10.58, 11.13, 11.89
Tasks: 137 total,   1 running, 136 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni,  0.0%id, 99.8%wa,  0.0%hi,  0.0%si,  0.0%st

Und schauen Sie sich die Prozesse im DStaat an.

root     27011  0.0  0.0      0     0 ?        S    03:12   0:00 [nfsd4]
root     27012  0.0  0.0      0     0 ?        S    03:12   0:00 [nfsd4_callbacks]
root     27013  0.0  0.0      0     0 ?        D    03:12   0:01 [nfsd]
root     27014  0.0  0.0      0     0 ?        D    03:12   0:01 [nfsd]
root     27015  0.0  0.0      0     0 ?        D    03:12   0:01 [nfsd]
root     27016  0.0  0.0      0     0 ?        D    03:12   0:01 [nfsd]

Antwort4

Der iowait umfasst die Netzwerkaufrufe. Ich sage das, weil NFS aus Sicht des Kernels wie viele lokale Linux-Dateisysteme behandelt wird:

$ vim linux-2.6.38.2/fs/nfs/file.c 

const struct file_operations nfs_file_operations = {
        .llseek         = nfs_file_llseek,
        .read           = do_sync_read,
        .write          = do_sync_write,
        .aio_read       = nfs_file_read,
        .aio_write      = nfs_file_write,
        .mmap           = nfs_file_mmap,
        .open           = nfs_file_open,
        .flush          = nfs_file_flush,
        .release        = nfs_file_release,
        .fsync          = nfs_file_fsync,
        .lock           = nfs_lock,
        .flock          = nfs_flock,
        .splice_read    = nfs_file_splice_read,
        .splice_write   = nfs_file_splice_write,
        .check_flags    = nfs_check_flags,
        .setlease       = nfs_setlease,
};

Wenn Prozesse einen Schreibvorgang für den Dateideskriptor 5 aufrufen, geschieht ungefähr Folgendes:

files->fd_array[5]->f_op->write(argv.......)

Die Prozesse wissen also nicht, welche Art von Dateisystem verwendet wird (VFS-Magie), und der Iowait ist dasselbe wie bei einem lokalen Dateisystem.

verwandte Informationen