为什么高IO速率操作会降低linux上的速度?

为什么高IO速率操作会降低linux上的速度?,linux,multicore,Linux,Multicore,这可能有点过时,但我想知道为什么在一个进程中大量使用IO(比如在同一个磁盘上从一个位置到另一个位置的cp大文件)会降低速度,即使是大部分CPU受限的进程。我注意到我在两个操作系统上都大量使用(MacOSX和linux) 特别是,我想知道为什么多核在这里没有真正的帮助:它是商品硬件(磁盘控制器等)的硬件限制,还是操作系统限制,还是分配正确的资源(调度)有内在的困难?高速IO操作通常意味着必须由CPU维护的高速中断,这需要CPU时间 在cp的情况下,它还使用了大量的可用内存带宽,因为每个数据块都被复

这可能有点过时,但我想知道为什么在一个进程中大量使用IO(比如在同一个磁盘上从一个位置到另一个位置的cp大文件)会降低速度,即使是大部分CPU受限的进程。我注意到我在两个操作系统上都大量使用(MacOSX和linux)


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

高速IO操作通常意味着必须由CPU维护的高速中断,这需要CPU时间


cp
的情况下,它还使用了大量的可用内存带宽,因为每个数据块都被复制到用户空间或从用户空间复制。这也将倾向于从CPU缓存和TLB中弹出其他进程所需的数据,这将使其他进程在发生缓存未命中时变慢。

因为复制大文件(大于可用缓冲区缓存)通常需要通过缓冲区缓存,这通常会导致最近使用较少的页面被抛出,然后必须将其带回

其他进程偶尔会执行少量IO(比如说只是统计一个目录),然后它们的缓存都会被吹走,必须进行物理读取才能将这些页面恢复


希望这可以通过一个copy命令来解决,该命令可以检测到这种情况,并相应地通知内核(例如,使用posix_fadvise),这样,一个不需要后续读取的文件的一次性大容量传输就不会完全丢弃缓冲缓存中所有干净的页面,这通常会发生。

这可能是当前计划程序的一个限制。谷歌“Galbraith的sched:autogroup补丁”或“linux奇迹补丁”(是的,真的!)。显然有一个200行的补丁正在被细化和合并,这增加了组调度,关于这一点:

我也很高兴它对互动表演的影响。 不可否认,我的“测试用例”真的很琐碎(以一种简单的方式阅读电子邮件) web浏览器,滚动一点,同时在 内核),但这是一个非常相关的测试用例 为了我。这是一个巨大的进步

视频前后

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

关于中断,我猜caf的假设是:

  • 每秒多次中断
  • 中断由任何/所有CPU提供服务
  • 因此,中断会刷新CPU缓存
您需要测试的统计数据是每个CPU每秒的中断数

我不知道是否有可能将中断绑定到单个CPU:请参阅以获取更多详细信息

有一点我不明白(这是我第一次看这个问题):我的笔记本电脑(运行Windows Vista)上的perfmon显示每秒2000次中断(每个内核上1000次),而它几乎处于空闲状态(除了显示perfmon之外什么都不做)。我无法想象哪个设备每秒会产生2000次中断,我本以为这足以清除CPU缓存(我猜繁忙线程的CPU量大约为50毫秒)。它还显示了平均350 DPCs/秒

高端硬件也有类似的问题吗


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

它们也会降低Windows上的所有速度。我相信这是因为CPU不能同时管理总线操作和CPU操作,但我相信这里有人有更好的响应。Windows上的情况更糟。Windows甚至限制IO吞吐量,以尝试保持可用性。这就是为什么它在许多基准测试中表现如此糟糕的原因。“即使是主要受CPU限制的进程”——这些进程也可能是“受I/O限制的”:即RAM I/O。如果你能找到(或制造)它们,我想情况会有所不同一个CPU受限的进程,主要/仅在其板载缓存中执行数据。顺便说一句,我曾经读到,大型机之所以被认为速度快,并不是因为CPU,而是因为它们具有惊人的I/O带宽。我也不同意将这个问题作为“离题”来结束:在我看来,至少对硬件有这么多的了解与编程有关。我不认为这直接归因于在中断级别花费的CPU时间:我想你会发现,这在CPU总利用率中所占比例不大。难道每个CPU都有自己的半独立缓存吗?如果是这样,那么您确定数据是从运行CPU绑定进程的CPU的缓存中弹出的吗?@ChrisW:OP提到了“多核”——同一个包中的两个核通常共享同一个二级缓存——这取决于争用CPU的任务数,
cp
可能是在运行CPU绑定任务的CPU上调度的。@caf:那么这将是围绕缓存和TLB的争用?这显然是一个我几乎一无所知的水平。我认为高端CPU每个核心都有单独的缓存,但对于统一的内存架构,似乎需要一个全局一致的TLB,对吗?高端硬件也有类似的问题吗?@caf:并不是说我不相信你的答案,而是你能给我一份参考资料让我更好地了解这个现象吗?另外,您是否知道在linux上验证您的假设的方法,例如,执行IO密集型操作时的中断次数。你能从用户空间访问任何关于TLB使用情况的统计数据吗?你是说这是文件系统的缓存,而不是CPU的缓存。是的,我想这是文件系统的缓存。原则上,copy命令可以复制一个非常