当我们做一些CPU密集型任务时,我们并行执行以减少总执行时间,我们使用并行执行,基本上最佳线程数等于Environment.ProcessorCount。它并不总是最佳的,但在大多数情况下。
好的,但是如果我在CPU上加载很少的IO密集任务会怎样。基本上如果在任务中没有使用CPU,那么使用1个线程会更快,从而无法获得切换开销。 但现在我意识到许多客户(我谈论服务器软件)都有raid,条带磁盘......在某些系统配置中,IO操作可以并行完成。但是,我怎样才能找到何时更好地使用并行IO以及如何找到我应该使用的线程数?是否有类似于Environment.ProcessorCount for IO的值,我知道-no。您是否知道为不同的系统配置找到最佳IO线程数的好方法?
我认为应该有某种形式的IO自定义任务调度程序,它针对IO进行了优化,但我找不到... IOTaskScheduler - 未针对性能进行优化
答案 0 :(得分:2)
对于IO限制工作,没有简单的指导方针。您不知道最佳吞吐量的重点是什么。这取决于硬件。例如,SSD具有独立的存储库。网络具有高延迟并且可以从流水线操作中受益。谁知道远程网络服务是什么样的。
测试不同的值并测量哪一个最快。
您甚至可以实现运行时基准测试,在该基准测试中运行不同程度的并行性并选择最快的并行度。或者你做一个像TPL使用的自适应算法。它推测性地增加了线程数量,如果吞吐量增加,它会保留新线程。如果它掉线,它就会退出线程。
答案 1 :(得分:1)
你做不到。主要问题是,即使没有raid控制器,它也会依赖于IO负载(类型)。当你添加Raid时,SAS的失控已经失控。可能有指导方针,但没有办法衡量最好的东西。我这里有一个raid阵列,有时会出现数万个未完成的IO请求,以及一个gb大小的raid控制器缓存,一个ssd缓存和六个SAS光盘,有时会在一两秒内处理掉。
措施。如果你想看一个项目 - 测量延迟。
完成请求需要更长时间的那一刻,你正在排队等候。然后优化。队列大小等无用 - 延迟是唯一真正衡量IO子系统繁忙程度的原因。
一旦oyu有了这个,你就可以建立一个反馈循环来调整并行度以获得最佳大小,但是然后-....。当其他一些软件启动时,你可能完全得到SNAFU(光盘扫描,反病毒是以此闻名。)