O iowait inclui o tempo de espera para chamadas de rede?

O iowait inclui o tempo de espera para chamadas de rede?

A proc(5)página de manual descreve iowait como "tempo de espera pela conclusão do IO". Isso foiprincipalmente explicadoem uma pergunta anterior. Minha pergunta é: enquanto espera pelo bloqueio de IO, isso inclui a espera pelo bloqueio de IO da rede ou apenas IO local?

Responder1

Significa esperar por "E/S de arquivo", ou seja, qualquer chamada de leitura/gravação em um arquivo que está no sistema de arquivos montado, mas também provavelmente conta o tempo de espera para trocar ou carregar páginas sob demanda na memória, por exemplo, bibliotecas não ainda na memória, ou páginas de arquivos mmap() que não estão na memória RAM.

NÃO conta o tempo gasto esperando por objetos IPC, como soquetes, pipes, ttys, select(), poll(), sleep(), pause() etc.

Basicamente, é o tempo que um thread passa esperando pelo disco-IO síncrono - durante esse tempo ele é teoricamente capaz de ser executado, mas não pode porque alguns dados necessários ainda não estão lá. Tais processos geralmente aparecem no estado “D” e contribuem para a carga média de uma caixa.

Confusamente, acho que isso provavelmente inclui IO de arquivos em sistemas de arquivos de rede.

Responder2

o tempo iowait é a quantidade de tempo que um processo gasta no agendador de E/S do kernel. Até onde eu sei, isso não tem nada a ver com E/S de rede, no que diz respeito às conexões de soquete regulares. No entanto, incluirá o tempo gasto esperando por sistemas de arquivos de rede como o NFS.

Responder3

Isso acontece.

Aliás, um dos servidores que eu gerencio está apresentando alto iowait, causado por uma montagem NFS incorreta.

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 veja os processos no 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]

Responder4

O iowait inclui as chamadas de rede. Digo isso porque o NFS é tratado como muitos sistemas de arquivos locais Linux do ponto de vista do 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 os processos chamam uma gravação no descritor de arquivo 5, algo assim acontecerá:

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

Portanto, os processos não sabem que tipo de sistema de arquivos estão usando (vfs magic) e o iowait é o mesmo para um sistema de arquivos local.

informação relacionada