我正在寻找一种方法来轻松加载测试和基准测试我们的一些SQL(使用ADO.NET,没有任何花哨的使用LINQ或PLINQ),在高并行负载下运行时必须具有高性能。
我曾考虑使用新的并行扩展CTP,特别是Parallel.For
/ Parallel.ForEach
来简单地运行SQL超过10k次迭代 - 但我无法找到任何数据这些都已经过优化。
基本上我担心因为数据库访问本质上是I / O绑定的,所以它不会产生足够的负载。有没有人知道是否并行。因为足够智能使用> x个线程(其中x = CPU的数量),如果它正在执行的任务不完全受CPU限制?即它的行为方式与托管线程池类似吗?
如果真的那么会很酷!
编辑:正如@CVertex在下面提到的那样,您可以单独设置线程数。有没有人知道默认情况下并行库是否足够智能,以便在作业受I / O限制时继续添加线程?
答案 0 :(得分:1)
当然可以!
您可以指定所需的每个CPU的最大线程数。
在你并行之前。无论你在做什么,你都必须从System.Threading.Tasks命名空间中实例化你自己的TaskManager。 查看ctor参数,了解如何根据自己的需要自定义任务管理器。
Parallel.For应该有一个重载,它需要一个任务管理器实例。
答案 1 :(得分:0)
另一种方法是定义PLINQ_DOP环境变量。来自文档:
PLINQ_DOP
DOP stands for degree of parallelism. Setting this environment variable defines the number of threads for PLINQ to use.
E.g. PLINQ_DOP=1 means single-threaded, while PLINQ_DOP=8 means PLINQ should use 8 threads.
If this is set to a value greater than the number of procs*cores available on the system,
PLINQ will use more threads than processors. If one of them blocks, for instance,
this allows other threads to make forward progress.