1

我正在寻找一种方法来轻松加载测试和基准测试我们的一些 SQL(使用 ADO.NET,使用 LINQ 或 PLINQ 没什么特别的),在高并行负载下运行时必须具有高性能。

我曾考虑使用新的并行扩展 CTP,特别是Parallel.For/Parallel.ForEach简单地运行 SQL 超过 10k 次迭代左右 - 但我无法找到任何关于这些优化的数据。

本质上,我担心因为数据库访问本质上是 I/O 绑定的,所以它不会产生足够的负载。有谁知道并行。如果它正在执行的任务不完全受 CPU 限制,是否足够智能以使用 > x 个线程(其中 x = CPU 数)?即它的行为方式与托管线程池类似吗?

如果是这样就更酷了!

编辑:正如@CVertex 在下面提到的,您可以独立设置线程数。有谁知道默认情况下并行库是否足够智能以在作业受 I/O 绑定时继续添加线程?

4

2 回答 2

1

当然可以!

您可以指定所需的每个 CPU 的最大线程数。

在你 Parallel.For 无论你在做什么之前,你必须从 System.Threading.Tasks 命名空间中实例化你自己的 TaskManager。查看 ctor 参数以了解如何根据自己的目的自定义任务管理器。

Parallel.For 应该有一个重载,它需要一个任务管理器实例。

于 2008-12-08T13:42:29.700 回答
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.
于 2008-12-08T13:55:39.487 回答