Использование Parallel.For для тестирования SQL-запросов и сравнения с ThreadPool - PullRequest
1 голос
/ 08 декабря 2008

Я ищу способ легко загрузить тест и протестировать некоторые из наших SQL (используя ADO.NET, ничего особенного, используя LINQ или PLINQ), который должен быть эффективен при работе с высокой параллельной нагрузкой.

Я думал об использовании новых параллельных расширений CTP и, в частности, Parallel.For / Parallel.ForEach для простого запуска SQL более 10 000 итераций или около того - но я не смог найти никаких данных о том, что это было оптимизирован для.

По сути, я обеспокоен тем, что, поскольку доступ к базе данных по своей природе связан с вводом / выводом, это не создаст достаточной нагрузки. Кто-нибудь знает, если параллельно. Разве достаточно умен, чтобы использовать> x потоков (где x = количество процессоров), если выполняемые им задачи не полностью связаны с процессором? То есть ведет себя ли он аналогично пулу управляемых потоков?

Было бы довольно круто, если бы это было так!

РЕДАКТИРОВАТЬ: Как @CVertex любезно ссылается ниже, вы можете установить количество потоков независимо. Кто-нибудь знает, достаточно ли интеллектуальны параллельные библиотеки для продолжения добавления потоков, если задание связано с вводом / выводом?

Ответы [ 2 ]

1 голос
/ 08 декабря 2008

Конечно, можно!

Вы можете указать максимальное количество потоков для каждого процессора.

Перед вами Parallel.For, что бы вы ни делали, вам придется создавать свой собственный TaskManager из пространства имен System.Threading.Tasks. Посмотрите на параметры ctor, чтобы увидеть, как вы можете настроить диспетчер задач для своих собственных целей.

Должна быть перегрузка для Parallel.For, которая принимает экземпляр диспетчера задач.

0 голосов
/ 08 декабря 2008

Другой способ - определить переменную среды 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.
...