【问题标题】:Optimal number of IO thread for different system configuration不同系统配置的最佳IO线程数
【发布时间】:2014-03-07 18:59:15
【问题描述】:

当我们执行一些 CPU 密集型任务时,我们并行执行以减少总执行时间,我们使用并行执行,基本上最佳线程数等于 Environment.ProcessorCount。它并不总是最优的,但在大多数情况下。

好的,但是如果我有密集的 IO 绑定任务,CPU 负载很小。基本上,如果 CPU 没有在任务中密集使用,那么使用 1 个线程会更快,不会产生切换开销。 但现在我意识到许多客户(我谈论服务器软件)有 RAID、条带磁盘……在某些系统配置中,IO 操作可以并行完成。但是我怎样才能找到最好使用并行 IO 的时间以及如何找到我应该使用多少线程?据我所知,IO 是否有像 Environment.ProcessorCount 这样的值?你知道找到适合不同系统配置的最佳 IO 线程数的好方法吗?


我认为应该有某种形式的 IO 自定义任务调度程序,它针对 IO 进行了优化,但我找不到... IOTaskScheduler - 没有针对性能进行优化

【问题讨论】:

  • 嗯,I/O 线程的最佳数量是……零(好吧,从技术上讲,它通常是一)。这就是异步 I/O 的用途——基本上,您的 I/O 操作不会消耗任何 CPU,因此为它们创建新线程是没有用的。相反,您使用异步回调,以便您仅在 CPU 上实际有工作要做时才获得一个线程。 awaitasync 从你那里很好地抽象出来。

标签: c# .net multithreading io parallel-processing


【解决方案1】:

对于 IO 密集型工作,没有简单的指导方针。您不知道最佳吞吐量的点是什么。这取决于硬件。例如,SSD 具有独立的存储库。网络具有高延迟,可以从流水线中受益。谁知道远程网络服务是什么样的。

测试不同的值并测量哪个值最快。

您甚至可以实施运行时基准测试,在其中运行不同程度的并行性并选择最快的。或者你做一个像 TPL 使用的自适应算法。它推测性地增加了线程数,如果吞吐量增加,它会保留新线程。如果它掉线了,它就会退出线程。

【讨论】:

  • 谢谢,我会尝试暗示,我已经有了这个想法,但是为什么没有像 blogs.msdn.com/b/pfxteam/archive/2010/04/09/9990424.aspx 这样的现成 IOTaskScheduler 但针对 .NET 的自适应性能进行了优化...
  • @BransDs 我希望有。听起来对我来说是一个有趣的爱好项目。不过,我发现大多数工作负载都可以调整一次以获得固定的并行度。不需要运行时自适应。
【解决方案2】:

你不能。主要问题是即使没有 RAID 控制器,它也非常依赖于 IO 负载(类型)。在你添加 Raid 的那一刻,SAS 的事情就失控了。可能有指导方针,但没有办法衡量最好的东西。我这里有一个 RAID 阵列,有时会达到数万个未完成的 IO 请求,并且在一个 gb 大小的 RAID 控制器缓存、一个 ssd 缓存和六个 SAS 磁盘之间有时会在一两秒内处理。

测量。如果您想查看一项 - 测量延迟。

当完成请求需要更长的时间时,您正在排队等候。然后对此进行优化。队列大小等是无用的 - 延迟是唯一真正衡量 IO 子系统有多忙的指标。

一旦 oyu 有了它,您就可以建立一个反馈循环来调整并行度以获得最佳大小,但是......著名)。

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2023-03-06
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多