¿Iowait incluye el tiempo de espera para llamadas de red?

¿Iowait incluye el tiempo de espera para llamadas de red?

La proc(5)página de manual describe iowait como "tiempo de espera para que se complete IO". Esto eramayormente explicadoen una pregunta anterior. Mi pregunta es: mientras espero bloquear IO, ¿esto incluye esperar a bloquear IO de red o solo IO local?

Respuesta1

Significa esperar "E/S de archivo", es decir, cualquier llamada de lectura/escritura en un archivo que está en el sistema de archivos montado, pero probablemente también cuenta el tiempo de espera para intercambiar o cargar páginas en la memoria, por ejemplo, bibliotecas no en la memoria todavía, o páginas de archivos mmap() que no están en la memoria RAM.

NO cuenta el tiempo dedicado a esperar objetos IPC como sockets, pipes, ttys, select(), poll(), sleep(), pausa(), etc.

Básicamente, es el tiempo que un subproceso pasa esperando la E/S de disco síncrona; durante este tiempo, teóricamente puede ejecutarse, pero no puede porque algunos datos que necesita aún no están disponibles. Estos procesos suelen aparecer en el estado "D" y contribuyen a la carga promedio de una caja.

De manera confusa, creo que esto probablemente incluye archivos IO en sistemas de archivos de red.

Respuesta2

El tiempo de espera es la cantidad de tiempo que pasa un proceso en el programador de E/S del kernel. Hasta donde yo sé, esto no tiene nada que ver con la E/S de la red en lo que respecta a las conexiones de socket normales. Sin embargo, incluirá el tiempo dedicado a esperar sistemas de archivos de red como NFS.

Respuesta3

Lo hace.

Por cierto, uno de los servidores que administro está experimentando un alto iowait causado por un montaje NFS incorrecto.

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

Y mire los procesos en el Destado.

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]

Respuesta4

El iowait incluye las llamadas de red. Digo esto porque NFS maneja tantos sistemas de archivos locales de Linux desde el punto de 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,
};

Cuando los procesos llaman a una escritura en el descriptor de archivo 5, sucederá algo como esto:

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

Entonces, el proceso no sabe qué tipo de sistema de archivos está usando (vfs magic) y iowait es el mismo que un sistema de archivos local.

información relacionada