为什么高IO率操作会降低linux上的所有内容?

时间:2010-11-27 08:06:37

标签: linux multicore

这可能有点OT,但我想知道为什么有一个大量使用IO的进程(比如在同一个磁盘上从一个位置到另一个位置的cp大文件)会减慢所有内容,甚至是主要受CPU限制的进程。我注意到在两个操作系统上我都大量使用(mac os x和linux)。

特别是,我想知道为什么多核在这里没有真正的帮助:它是商品硬件的硬件限制(磁盘控制器等等),操作系统限制,还是存在分配权利的内在困难资源(调度)?

4 个答案:

答案 0 :(得分:4)

这可能是当前调度程序的限制。 Google“Galbraith的sched:autogroup patch”或“linux miracle patch”(是的!)。在改进和合并的过程中显然有200行补丁,这增加了组调度,其中Linus says

  

我对它对互动表现的作用也非常满意。   不可否认,我的“测试用例”真是微不足道(阅读电子邮件中的一个   网页浏览器,滚动一下,同时做一个“make -j64”   内核同时),但它是一个非常相关的测试用例   为了我。这是巨大的改进。

之前和之后的视频here

答案 1 :(得分:2)

因为,复制一个大文件(大于可用的缓冲区缓存)通常需要通过缓冲区缓存,这通常会导致最近使用的页面被丢弃,然后必须将其重新引入。

其他正在进行少量偶尔IO的过程(比如只是统计目录)然后让他们的缓存全部被吹走,并且必须进行物理读取才能将这些页面重新打入。

希望这可以通过copy-command来修复,该命令可以检测到这种事情并相应地建议内核(例如使用posix_fadvise),以便进行大量的一次性批量传输,而不需要随后读取并不会完全丢弃缓冲区缓存中的所有干净页面,现在通常情况下这些页面都会发生。

答案 2 :(得分:1)

高速率的IO操作通常意味着必须由CPU服务的高速中断,这需要CPU时间。

cp的情况下,它还使用相当大的可用内存带宽,因为每个数据块都复制到用户空间或从用户空间复制。这也会从CPU缓存和TLB中弹出其他进程所需的数据,这会在缓存未命中时降低其他进程的速度。

答案 3 :(得分:0)

  

另外,您是否知道在linux上验证您的假设的方法,例如:执行IO密集型操作时的中断次数。

关于中断,我猜这个咖啡馆的假设是:

  • 每秒许多中断;
  • 中断由任何/所有CPU提供服务;
  • 因此,中断刷新CPU缓存。

您需要测试的统计信息是每个CPU每秒的中断数。

我不知道是否可以将中断绑定到单个CPU:有关详细信息,请参阅http://www.google.com/#q=cpu+affinity+interrupt

这是我不明白的事情(这是我第一次看到这个问题):我的笔记本电脑上的perfmon(运行Windows Vista)显示2000个中断/秒(每个核心上1000个),当它几乎空闲时(除了显示perfmon之外什么都不做)。我无法想象哪个设备正在产生2000个中断/秒,我认为这足以吹走CPU缓存(我的猜测是繁忙线程的CPU量是50毫秒)。它还显示平均每秒350个DPC。

  

高端硬件是否会遇到类似的问题?

一种硬件差异可能是磁盘硬件和磁盘设备驱动程序,产生更多或更少的中断和/或其他争用。