iowait에는 네트워크 호출을 기다리는 시간이 포함되나요?

iowait에는 네트워크 호출을 기다리는 시간이 포함되나요?

proc(5)페이지에서는 iowait를 "IO가 완료될 때까지 기다리는 시간"으로 설명합니다. 이했다대부분 설명됨이전 질문에서. 내 질문은: IO 차단을 기다리는 동안 여기에는 네트워크 IO 차단을 기다리는 것이 포함됩니까, 아니면 로컬 IO만 기다리는 것이 포함됩니까?

답변1

이는 "파일 I/O", 즉 마운트된 파일 시스템에 있는 파일에 대한 읽기/쓰기 호출을 기다리는 것을 의미하지만 아마도 페이지를 메모리로 교체하거나 요구적으로 로드하기 위해 기다리는 시간도 계산할 수 있습니다. 예를 들어 라이브러리는 그렇지 않습니다. 아직 메모리에 있거나 RAM에 없는 mmap() 파일 페이지가 있습니다.

소켓, 파이프, tty, select(), poll(), sleep(), Pause() 등과 같은 IPC 객체를 기다리는 데 소요된 시간은 계산하지 않습니다.

기본적으로 스레드가 동기식 디스크 IO를 기다리는 데 소요되는 시간입니다. 이 시간 동안 이론적으로는 실행할 수 있지만 필요한 일부 데이터가 아직 없기 때문에 실행할 수 없습니다. 이러한 프로세스는 일반적으로 "D" 상태로 나타나며 상자의 평균 로드에 영향을 줍니다.

혼란스럽게도 여기에는 네트워크 파일 시스템의 파일 IO가 포함되어 있을 것 같습니다.

답변2

iowait 시간은 프로세스가 커널 I/O 스케줄러에서 소비하는 시간입니다. 내가 아는 한, 이것은 일반 소켓 연결이 이루어지는 한 네트워크 I/O와 아무 관련이 없습니다. 그러나 여기에는 NFS와 같은 네트워크 파일 시스템을 기다리는 데 소요되는 시간이 포함됩니다.

답변3

그렇습니다.

그런데 제가 관리하는 서버 중 하나에서 잘못된 NFS 마운트로 인해 높은 iowait가 발생하고 있습니다.

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

그리고 상태의 프로세스를 살펴보십시오 D.

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]

답변4

iowait에는 네트워크 호출이 포함됩니다. 이렇게 말하는 이유는 NFS가 커널의 관점에서 볼 때 많은 Linux 로컬 파일 시스템을 처리하기 때문입니다.

$ 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,
};

프로세스가 파일 설명자 5에 대한 쓰기를 호출하면 다음과 같은 일이 발생합니다.

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

따라서 프로세스는 어떤 종류의 파일 시스템을 사용하고 있는지(vfs 매직) 알지 못하며 iowait는 로컬 파일 시스템과 동일합니다.

관련 정보