为什么高磁盘 I/O 会降低系统响应速度/性能?

tsh*_*ang 19 linux performance kernel io

我一直不明白为什么高磁盘 I/O 会如此减慢系统速度。这对我来说很奇怪,因为我预计减速只会影响那些依赖于硬盘/光驱数据的进程,但减速甚至会影响加载到 RAM 上的内容。我在这里指的是iowait

为什么处理器要等待,而不是做其他工作?谁能解释这个限制以及为什么它没有在 Linux 内核中解决?有没有没有这个问题的内核?

[注意] 在这方面已经取得一些进展。一方面,后来的内核(在我的例子中是 2.6.37)响应更快。

Wim*_*nen 9

操作系统使用虚拟内存,因此可以使用比可用物理 RAM 多的内存。当内核决定更好地使用物理内存页面时,其内容可能会被“调出”以存储在磁盘上。当这样一个虚拟内存页面在调出时被访问,它会产生一个页面错误并从磁盘移回 RAM。

页面错误对性能来说是一场灾难,因为磁盘延迟以毫秒为单位,而 RAM 延迟以纳秒为单位。(1 毫秒 = 一百万纳秒!)

内存不仅被用户进程使用,而且被内核用于文件系统缓存之类的事情。在文件系统活动期间,内核将缓存最近使用的数据。假设很可能很快就会再次使用相同的数据,因此缓存应该可以提高 I/O 性能。

用于文件系统缓存的物理内存不能用于进程,因此在文件系统活动期间,更多的进程内存将被调出,页面错误会增加。此外,更少的磁盘 I/O 带宽可用于在磁盘之间移动内存页面。因此,进程可能会停止。


xen*_*ide 5

据我了解,IOwait 意味着一个进程,而不是处理器,正在等待 IO 变得可用。处理器的速度比硬盘快得多,这意味着更多的代码将完成得更快,然后需要读取磁盘。当需要读取的内容多于驱动器的读取速度时,您最终会等待处理器。决定谁读取/写入磁盘的方式由块调度程序决定,在大多数情况下现在是 CFQ。如果您正在使用 CFQ,并且您需要一个进程来使用更少的整体 IO 时间来提高系统响应能力,则可以使用ionice -c3 <processid>. 这告诉系统只在没有其他需要时才给这个进程 IO。

仍然很有趣,并且更好地解释了 iowait 问题。