我一直不太明白为什么高磁盘 I/O 会导致系统速度如此之慢。这对我来说很奇怪,因为我预计速度减慢只会影响那些依赖于硬盘/光驱数据的进程,但速度减慢甚至会影响加载到 RAM 上的内容。我在这里指的是等待。
为什么处理器要等待,而不是做其他工作?谁能解释一下这个限制以及为什么它在 Linux 内核中没有得到解决?有没有没有这个问题的内核?
[笔记] 已经有一些进展在这个表演领域。其一,较新的内核(在我的例子中为 2.6.37)响应速度更快。
答案1
操作系统利用虚拟内存以便可以使用比可用物理 RAM 更多的内存。当内核决定它可以更好地使用物理内存页面时,其内容可能会被“调出”以存储在磁盘上。当这样的虚拟内存页在调出时被访问时,它会生成一个页面错误并从磁盘移回 RAM。
页面错误对性能来说是一场灾难,因为磁盘延迟以毫秒为单位,而 RAM 延迟以纳秒为单位。 (1 毫秒 = 一百万纳秒!)
内存不仅由用户进程使用,还由内核用于文件系统缓存等操作。在文件系统活动期间,内核将缓存最近使用的数据。假设很可能很快就会再次使用相同的数据,因此缓存应该可以提高 I/O 性能。
用于文件系统缓存的物理内存不能用于进程,因此在文件系统活动期间,更多的进程内存将被调出,页面错误将会增加。此外,可用于将内存页从磁盘移出或移入磁盘的磁盘 I/O 带宽也较少。因此,进程可能会停滞。
答案2
据我了解,IOwait 意味着一个进程,而不是处理器,正在等待 IO 变得可用。处理器的速度比硬盘快得多,这意味着更多的代码将更快地完成,然后需要读取磁盘。当需要读取的数据量超过驱动器的读取速度时,处理器就会等待。决定谁读/写磁盘的方式由块调度程序决定,现在大多数情况下是 CFQ。如果您使用 CFQ,并且需要一个进程使用更少的总体 IO 时间来提高系统响应能力,则可以使用ionice -c3 <processid>
.这告诉系统仅在没有其他需要时才为该进程提供 IO。
这仍然很有趣,并且更好地解释了 iowait 问题。