手册proc(5)
页将 iowait 描述为“等待 IO 完成的时间”。这是大多解释在之前的问题中。我的问题是:在阻塞 IO 中等待时,这是否包括等待阻塞网络 IO,还是仅包括等待本地 IO?
答案1
它的意思是等待“文件 I/O”,也就是说,对已挂载文件系统中的文件的任何读/写调用,但也可能计算等待交换或按需加载页面到内存的时间,例如尚未在内存中的库,或不在内存中的 mmap() 文件的页面。
它不计算等待 IPC 对象(例如套接字、管道、ttys、select()、poll()、sleep()、pause() 等)的时间。
基本上,这是线程等待同步磁盘 IO 所花费的时间 - 在此期间,理论上线程可以运行,但由于某些所需数据尚未到达而无法运行。此类进程通常显示为“D”状态,并影响机器的平均负载。
令人困惑的是,我认为这可能包括网络文件系统上的文件 IO。
答案2
iowait 时间是进程在内核 I/O 调度程序中花费的时间。据我所知,就常规套接字连接而言,这与网络 I/O 无关。但是,它将包括等待 NFS 等网络文件系统所花费的时间。
答案3
是的。
顺便说一句,我管理的一台服务器遇到了高 iowait 问题,这是由于 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
并观察该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 magic),并且 iowait 与本地文件系统相同。