这可能有点OT,但我想知道为什么有一个大量使用IO的进程(比如在同一个磁盘上从一个位置到另一个位置的cp大文件)会减慢所有内容,甚至是主要受CPU限制的进程。我注意到在两个操作系统上我都大量使用(mac os x和linux)。
特别是,我想知道为什么多核在这里没有真正的帮助:它是商品硬件的硬件限制(磁盘控制器等等),操作系统限制,还是存在分配权利的内在困难资源(调度)?
答案 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:有关详细信息,请参阅http://www.google.com/#q=cpu+affinity+interrupt。
这是我不明白的事情(这是我第一次看到这个问题):我的笔记本电脑上的perfmon(运行Windows Vista)显示2000个中断/秒(每个核心上1000个),当它几乎空闲时(除了显示perfmon之外什么都不做)。我无法想象哪个设备正在产生2000个中断/秒,我认为这足以吹走CPU缓存(我的猜测是繁忙线程的CPU量是50毫秒)。它还显示平均每秒350个DPC。
高端硬件是否会遇到类似的问题?
一种硬件差异可能是磁盘硬件和磁盘设备驱动程序,产生更多或更少的中断和/或其他争用。