proc(5)页将iowait描述为“等待IO完成的时间”。 这主要是在前面的问题中解释的。 我的问题是:在等待阻塞IO,这是否包括等待阻塞networkingIO,或只有本地IO?
这意味着要等待“文件I / O”,也就是说,在已挂载的文件系统中的文件上进行任何读/写调用,但也可能等待时间等待交换或按需加载页面到内存中,例如库在内存中,或者不在RAM中的mmap()文件的页面。
它不会计算等待IPC对象(如套接字,pipe道,ttys,select(),poll(),sleep(),pause()等的时间。
基本上是线程花费在等待同步磁盘IO的时间 – 在这段时间内,理论上能够运行,但不能,因为它需要的一些数据还没有。 这样的过程通常以“D”状态出现,并有助于盒子的平均负荷。
令人困惑的是,我认为这可能包括networking文件系统上的文件IO。
iowait时间是进程花费在内核I / O调度器上的时间量。 据我所知,在普通套接字连接的情况下,这与networkingI / O没有任何关系。 但是,这将包括等待NFS等networking文件系统所花费的时间。
它确实。
顺便说一句,我pipe理的服务器之一显示遇到高NFS错误,这是由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]
iowait包括networking调用,我这样说,因为从内核的angular度来看,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与本地文件系统是一样的。