Alex J Asked: 2009-07-08 18:29:10 +0800 CST2009-07-08 18:29:10 +0800 CST 2009-07-08 18:29:10 +0800 CST iowait 是否包括等待网络调用的时间? 772 手册页将proc(5)iowait 描述为“等待 IO 完成的时间”。这主要在较早的问题中进行了解释。我的问题是:在等待阻塞 IO 时,这包括等待阻塞网络 IO,还是仅等待本地 IO? linux unix iowait 4 个回答 Voted Best Answer MarkR 2009-07-08T23:17:53+08:002009-07-08T23:17:53+08:00 这意味着等待“文件 I/O”,也就是说,对已挂载文件系统中的文件的任何读/写调用,但也可能计算等待换入或按需加载页面到内存的时间,例如库不是在内存中,或者不在内存中的 mmap()'d 文件的页面。 它不计算等待 IPC 对象(如套接字、管道、ttys、select()、poll()、sleep()、pause() 等)所花费的时间。 基本上是线程等待同步磁盘 IO 的时间——在此期间,理论上它可以运行但不能运行,因为它需要的一些数据还不存在。此类过程通常以“D”状态显示并有助于盒子的平均负载。 令人困惑的是,我认为这可能包括网络文件系统上的文件 IO。 Kamil Kisiel 2009-07-08T21:30:39+08:002009-07-08T21:30:39+08:00 iowait 时间是进程在内核 I/O 调度程序中花费的时间。据我所知,就常规套接字连接而言,这与网络 I/O 没有任何关系。但是,它将包括等待 NFS 等网络文件系统所花费的时间。 Sreeraj 2014-12-11T01:01:52+08:002014-12-11T01:01:52+08:00 确实如此。 顺便说一句,我管理的其中一台服务器遇到了高 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] c4f4t0r 2014-12-11T02:35:19+08:002014-12-11T02:35:19+08:00 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 与本地文件系统相同。
这意味着等待“文件 I/O”,也就是说,对已挂载文件系统中的文件的任何读/写调用,但也可能计算等待换入或按需加载页面到内存的时间,例如库不是在内存中,或者不在内存中的 mmap()'d 文件的页面。
它不计算等待 IPC 对象(如套接字、管道、ttys、select()、poll()、sleep()、pause() 等)所花费的时间。
基本上是线程等待同步磁盘 IO 的时间——在此期间,理论上它可以运行但不能运行,因为它需要的一些数据还不存在。此类过程通常以“D”状态显示并有助于盒子的平均负载。
令人困惑的是,我认为这可能包括网络文件系统上的文件 IO。
iowait 时间是进程在内核 I/O 调度程序中花费的时间。据我所知,就常规套接字连接而言,这与网络 I/O 没有任何关系。但是,它将包括等待 NFS 等网络文件系统所花费的时间。
确实如此。
顺便说一句,我管理的其中一台服务器遇到了高 iowait,这是由错误的 NFS 挂载引起的。
并查看
D
状态中的进程。iowait 包括网络调用。我这么说是因为从内核的角度来看,NFS 处理的 linux 本地文件系统数量一样多:
当进程调用文件描述符 5 上的写入时,会发生以下情况:
因此,进程不知道正在使用哪种文件系统(vfs 魔法),iowait 与本地文件系统相同。