Lösung 1:
Es bedeutet, auf "Datei-E / A" zu warten, dh auf jeden Lese- / Schreibaufruf für eine Datei, die sich im gemounteten Dateisystem befindet, aber wahrscheinlich auch die Zeit zählt, die darauf wartet, Seiten einzulagern oder bei Bedarf in den Speicher zu laden, z. Bibliotheken, die sich noch nicht im Speicher befinden, oder Seiten mit mmap()-Dateien, die sich nicht im RAM befinden.
Es zählt NICHT die Wartezeit für IPC-Objekte wie Sockets, Pipes, ttys, select(), poll(), sleep(), pause() etc.
Im Grunde ist es die Zeit, die ein Thread damit verbringt, auf synchrones Disc-IO zu warten - während dieser Zeit kann er theoretisch ausgeführt werden, kann es aber nicht, weil einige Daten, die er benötigt, noch nicht vorhanden sind. Solche Prozesse werden normalerweise im "D"-Zustand angezeigt und tragen zum Lastdurchschnitt einer Box bei.
Verwirrenderweise denke ich, dass dies wahrscheinlich Datei-IO auf Netzwerk-Dateisystemen beinhaltet.
Lösung 2:
Die iowait-Zeit ist die Zeit, die ein Prozess im I/O-Scheduler des Kernels verbringt. Soweit ich weiß, hat dies nichts mit Netzwerk-I/O zu tun, sofern es sich um normale Socket-Verbindungen handelt. Es wird jedoch die Wartezeit für Netzwerkdateisysteme wie NFS einschließen.
Lösung 3:
Es tut.
Übrigens hat einer der Server, die ich verwalte, einen hohen iowait-Wert, der durch einen fehlerhaften NFS-Mount 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
an Zustand.
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]
Lösung 4:
Das iowait enthält die Netzwerkaufrufe. Ich sage das, weil NFS aus Sicht des Kernels wie viele lokale Linux-Dateisysteme gehandhabt 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 Schreibzugriff auf den Dateideskriptor 5 aufrufen, geschieht etwa Folgendes:
files->fd_array[5]->f_op->write(argv.......)
Daher wissen die Prozesse nicht, welche Art von Dateisystem verwendet wird (vfs magic) und das iowait ist das gleiche wie bei einem lokalen Dateisystem.