Soluzione 1:
Significa attendere "File I/O", vale a dire qualsiasi chiamata di lettura/scrittura su un file che si trova nel filesystem montato, ma probabilmente conta anche il tempo di attesa per lo scambio o il caricamento di pagine in memoria, ad es. librerie non ancora in memoria, o pagine di file mmap() che non sono in ram.
NON conta il tempo trascorso in attesa di oggetti IPC come socket, pipe, tty, select(), poll(), sleep(), pause() ecc.
Fondamentalmente è il tempo che un thread trascorre in attesa di disc-IO sincrono - durante questo periodo è teoricamente in grado di funzionare ma non può perché alcuni dati di cui ha bisogno non sono ancora presenti. Tali processi di solito si presentano nello stato "D" e contribuiscono al carico medio di una scatola.
In modo confuso, penso che questo includa probabilmente l'IO di file sui filesystem di rete.
Soluzione 2:
il tempo iowait è la quantità di tempo che un processo trascorre nello scheduler I/O del kernel. Per quanto ne so, questo non ha nulla a che fare con l'I/O di rete nella misura in cui vanno le normali connessioni socket. Tuttavia, includerà il tempo trascorso in attesa di file system di rete come NFS.
Soluzione 3:
Lo fa.
Per inciso, uno dei server che gestisco sta riscontrando un iowait elevato causato da un errato montaggio NFS.
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
E guarda i processi nel D
stato.
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]
Soluzione 4:
Iowait include le chiamate di rete. Dico questo, perché NFS è gestito come molti filesystem locali Linux dal punto di vista del kernel:
$ 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,
};
Quando i processi chiamano una scrittura sul descrittore di file 5, accadrà qualcosa del genere:
files->fd_array[5]->f_op->write(argv.......)
Quindi, i processi non sanno che tipo di filesystem stanno usando (vfs magic) e iowait è lo stesso per un filesystem locale.