
맨 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는 로컬 파일 시스템과 동일합니다.