代码之家  ›  专栏  ›  技术社区  ›  David Cournapeau

为什么高IO率操作会降低Linux上的所有操作速度?[关闭]

  •  16
  • David Cournapeau  · 技术社区  · 14 年前

    这可能有点OT,但我想知道为什么一个进程大量使用IO(比如cp大文件在同一个磁盘上从一个位置到另一个位置)会降低所有速度,甚至是那些主要受CPU限制的进程。我注意到在这两个操作系统上我都大量使用(MacOSX和Linux)。

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   MarkR    14 年前

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

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

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

        2
  •  4
  •   Ken    14 年前

    它可能是当前调度程序的一个限制。google“galbraith's sched:autogroup patch”或“linux miracle patch”(是的,真的!).显然有一个200行的补丁正在被改进和合并,这增加了组调度,关于 Linus says :

    我也很满意它对互动表演的影响。 不可否认,我的“测试用例”非常简单(在 Web浏览器,滚动一点,同时在 同时也是内核),但这是一个非常相关的测试案例 为了我。这是一个 巨大的 改进。

    视频前后 here .

        3
  •  1
  •   caf    14 年前

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

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

        4
  •  0
  •   ChrisW    14 年前

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

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

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

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

    我不知道是否可以将中断连接到单个CPU:请参见 http://www.google.com/#q=cpu+affinity+interrupt 更多详情。

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

    高端硬件是否存在类似问题?

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