
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 D
Staat 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.