Множество потоков с одной операцией для построения трудоемких объектов в .net - PullRequest
1 голос
/ 04 декабря 2011

У меня есть метод GetProducts, который возвращает 20 продуктов.Создание каждого продукта занимает много времени (много ресурсов из разных мест).

Вы бы порекомендовали создать 20 различных потоков (используя очередь пула потоков) для создания каждого продукта?

Повредит ли это серверу при большой нагрузке?У моего приложения есть риск оказаться под высокой нагрузкой.

Причина, по которой я это поднимаю, заключается в том, что я фактически реализовал нечто подобное, и во время выполнения нагрузочных тестов мой сервер оказался на коленяхи требует полной перезагрузки, чтобы вернуться к нормальной работе.

Есть ли подход, который мне не хватает?Я делаю это совершенно неправильно?Должен ли я придерживаться синхронной обработки?

ПРИМЕЧАНИЕ : При выполнении моего нагрузочного теста память сервера использовалась слишком часто, а иногда и возникала ошибка (серверу не хватало памяти).Сборщик мусора работает недостаточно быстро?

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

Кроме того, моя архитектура представляет собой двухуровневую установку с веб-интерфейсом, полностью работающим на сервисах wcf (который выполняет многопоточность).Уровень wcf - это то, что становится калекой.Серверы являются виртуальными на 8-ядерном сервере с выделенным ГБ оперативной памяти.

ЛИЧНОЕ ПРИМЕЧАНИЕ У меня такое чувство, что я злоупотребляю многопоточностью.Вызов «GetProducts» должен быть асинхронным, но «GetProducts» НЕ ДОЛЖЕН выполнять 20 асинхронных операций.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Даже если вы привязаны к процессору, раскручивание 20 потоков, вероятно, излишне, если у вас нет 20 ядер и не может выделить их для этого - т.е.

Добавление потоков также усложняет синхронизацию - мне действительно интересно, заблокирована ли ваша текущая реализация.

Если данные поступают из разных мест, то асинхронность имеет смысл, но может быть чрезмерной.В некоторых случаях использование потоков пула может быть заманчивым, так как это не полностью украдет обработку одного из всей системы (у пула есть некоторая встроенная рассудительность, и он обычно использует <20 потоков для обслуживания 20 элементов). </p>

1 голос
/ 04 декабря 2011

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

Как уже упоминал Марк, если у вас нет 20 ядер, чтобы посвятить этому КОНКУРРЕНТНОМУ КЛИЕНТУ, вы действительно не получите много, делая это. Я стараюсь избегать многопоточного кода на моем веб-сервере, если это вообще возможно, потому что это может привести к тупикам, если вы не будете осторожны.

...