Ограничение параллельных потоков равным количеству процессоров? - PullRequest
6 голосов
/ 24 декабря 2009

Есть ли какие-либо преимущества в ограничении числа параллельных потоков, выполняющих данную задачу, равным количеству процессоров в хост-системе? Или лучше просто доверять библиотекам, таким как .NET ThreadPool, чтобы делать правильные вещи ... даже если в любой момент времени происходит 25 различных параллельных потоков?

Ответы [ 4 ]

8 голосов
/ 24 декабря 2009

Большинство потоков не связаны с процессором, они в конечном итоге ожидают ввода-вывода или других событий. Если вы посмотрите на свою систему сейчас, я думаю, у вас есть 100 (если не 1000) потоков, выполняющихся без проблем. По этому показателю вам, вероятно, лучше всего просто оставить пул потоков .NET, чтобы поступить правильно!

Однако, если все потоки были связаны с процессором (например, что-то вроде трассировки лучей), то было бы неплохо ограничить количество потоков количеством ядер, иначе есть вероятность, что переключение контекста начнет снижать производительность.

3 голосов
/ 24 декабря 2009

Threadpool уже достаточно хорошо справляется с этой задачей. Он пытается ограничить количество запущенных потоков количеством ядер ЦП на вашем компьютере. Когда один поток заканчивается, он немедленно планирует другой подходящий поток для выполнения.

Каждые 0,5 секунды он оценивает, что происходит с запущенными потоками. Когда потоки выполняются слишком долго, он предполагает, что они остановились, и позволяет другому потоку начать выполнение. Теперь у вас будет больше потоков, чем у процессорных ядер. Это может доходить до максимального количества разрешенных потоков, как установлено ThreadPool.SetMaxThreads ().

Начиная с .NET 2.0 с пакетом обновления 1 (SP1), максимальное количество потоков по умолчанию было значительно увеличено в 250 раз по сравнению с количеством ядер. Вы никогда не должны туда добраться. Если вы это сделаете, вы бы потратили около 2 минут времени, когда выполнялось, возможно, неоптимальное количество потоков. Тем не менее, все эти потоки должны были бы блокироваться так долго, что не является типичным шаблоном выполнения для потока. С другой стороны, если все эти потоки ожидают одного и того же вида ресурса, они, вероятно, просто по очереди, добавление большего количества потоков не может улучшить пропускную способность.

Короче говоря, пул потоков будет работать хорошо, если вы запускаете потоки, которые выполняются быстро (не более секунды) и не блокируются в течение длительного времени. Возможно, вам следует подумать о создании собственных объектов Thread, если ваш код не соответствует этому шаблону.

1 голос
/ 24 декабря 2009

Измерьте ваше приложение в различных соотношениях потоков: процессоров. Приходите к выводам на основе достоверных данных о вашем приложении. Не принимайте никаких аргументов из первых принципов о том, какую производительность вы должны получить, имеет значение только то, что вы делаете .

1 голос
/ 24 декабря 2009

Что ж, если ваше узкое место ТОЛЬКО процессоры, тогда это может иметь смысл, но при этом игнорируются все узкие места в памяти и другие операции ввода-вывода, и есть вероятность, что по крайней мере ваша кеш-память выдает сбои страниц и другие события, которые замедляют резьб.

Я бы сам доверял библиотеке. Потоки ждут всевозможных вещей, и вы не хотите, чтобы ваше приложение замедлялось, потому что оно не может порождать новый поток, даже если большинство остальных просто спят, ожидая какого-либо события или ресурса.

...