【问题标题】:How can I increase the I/O queue depth to maximize performance如何增加 I/O 队列深度以最大化性能
【发布时间】:2011-05-02 14:59:26
【问题描述】:

磁盘基准测试通常有一个图表,显示 I/O 吞吐量随着队列深度的增加而增加。我假设在硬件级别发生的事情是磁盘控制器正在重新排序请求以与磁头恰好所在的位置一致。但是如何在我自己的 I/O 繁重的应用程序中增加队列深度呢?我将使用 C#,但与语言无关的答案可能也会有所帮助。

我想到的一个(未经测试的)方法是将我的磁盘访问拆分为多个文件并在多个线程中发出 I/O。但肯定有一种方法可以做到这一点,而无需为每个并行 I/O 使用一个线程。而且我还假设不需要拆分为多个文件,因为数据库通常是一个文件。

【问题讨论】:

  • 是否像打开 FileStream 并进行多次 BeginRead() 调用一样简单?还是他们会在进入磁盘队列之前在 FrameWork 队列中排队?
  • 是的,这里靠近顶部的文字似乎表明它就是这么简单:msdn.microsoft.com/en-us/library/kztecsys(VS.80).aspx
  • 不确定您在支持该理论的页面上阅读的内容。
  • “当许多 I/O 请求同时挂起时,异步 I/O 可以提供更好的性能”

标签: c# io parallel-processing disk


【解决方案1】:

您不需要为每个 I/O 操作使用一个线程,但您确实需要并行化您的 I/O。 通常执行大规模 I/O(如数据库)的服务器使用 I/O completion ports (IOCP)。完成端口允许多个 I/O 请求并行挂起 - 并且可以最大限度地提高底层硬件对排队请求重新排序的能力。当挂起的 I/O 操作完成时,IOCP 使用对线程池的回调来通知应用程序。

不幸的是,C# 对完成端口的(内置)支持有限 - 但是,有一些 open-source libraries 试图弥合这一差距。

请注意,IOCP 不适合弱者 - 只有当您真正执行大量 I/O 时,性能优势才会累积。

【讨论】:

  • 谢谢。但是来自您第二个链接的 cmets:“托管 IOCP 的主要目标是为 .Net 开发人员提供一个可等待事件队列,并对队列中等待的线程进行并发控制。托管 IOCP 不处理任何 I/O 异步方式。”
  • 根据stackoverflow.com/questions/2785194/… 的 Aaronaught 所说,Stream.BeginRead 使用 I/O 完成端口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2015-02-21
  • 2023-03-21
  • 2016-02-18
  • 2011-05-07
  • 2012-10-11
相关资源
最近更新 更多