Multi-producer/multi-consumer задача.
От: BloodyTux  
Дата: 02.10.10 19:25
Оценка:
Здравствуйте!

Возникла следующая задача: имеется большое количество клиентских потоков (высокая конкуренция, т.е. порядка 100-200 штук ) и несколько рабочих в зависимости от числа ядер процессора. Клиенты отправляют задания для рабочих потоков (помещают в общую очередь), а потом через некоторое время проверяют выполнено ли задание и забирают результат, если он готов. Основное требование — постоянная загрузка рабочих потоков. Я прикинул, что если скажем 2 рабочих потока будут ломится через тот же мьютекс, что и 200 потоков клиентов, то они будут простаивать. Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной проблемы.
Re: Multi-producer/multi-consumer задача.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.10.10 19:57
Оценка: 2 (2)
Здравствуйте, BloodyTux, Вы писали:

BT>Здравствуйте!


BT>Возникла следующая задача: имеется большое количество клиентских потоков (высокая конкуренция, т.е. порядка 100-200 штук ) и несколько рабочих в зависимости от числа ядер процессора. Клиенты отправляют задания для рабочих потоков (помещают в общую очередь), а потом через некоторое время проверяют выполнено ли задание и забирают результат, если он готов. Основное требование — постоянная загрузка рабочих потоков. Я прикинул, что если скажем 2 рабочих потока будут ломится через тот же мьютекс, что и 200 потоков клиентов, то они будут простаивать. Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной проблемы.


При таком количестве потоков вас уже ниче не спасет.
Re: Multi-producer/multi-consumer задача.
От: SergH Россия  
Дата: 02.10.10 20:11
Оценка:
Здравствуйте, BloodyTux, Вы писали:

BT>Возникла следующая задача: имеется большое количество клиентских потоков (высокая конкуренция, т.е. порядка 100-200 штук ) и несколько рабочих в зависимости от числа ядер процессора. Клиенты отправляют задания для рабочих потоков (помещают в общую очередь), а потом через некоторое время проверяют выполнено ли задание и забирают результат, если он готов. Основное требование — постоянная загрузка рабочих потоков. Я прикинул, что если скажем 2 рабочих потока будут ломится через тот же мьютекс, что и 200 потоков клиентов, то они будут простаивать. Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной проблемы.


С разных концов очередь могут охранять разные мьютексы.
Делай что должно, и будь что будет
Re: Multi-producer/multi-consumer задача.
От: Gurney Великобритания www.kharlamov.biz
Дата: 03.10.10 07:17
Оценка: +1
Здравствуйте, BloodyTux, Вы писали:

BT>Возникла следующая задача: имеется большое количество клиентских потоков (высокая конкуренция, т.е. порядка 100-200 штук ) и несколько рабочих в зависимости от числа ядер процессора. Клиенты отправляют задания для рабочих потоков (помещают в общую очередь), а потом через некоторое время проверяют выполнено ли задание и забирают результат, если он готов. Основное требование — постоянная загрузка рабочих потоков. Я прикинул, что если скажем 2 рабочих потока будут ломится через тот же мьютекс, что и 200 потоков клиентов, то они будут простаивать. Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной проблемы.


Судя по тому, что consumer-ов у вас много, порядок обработки заданий вам не очень важен. Поэтому в исползовании очереди нет необходимости. Только некоторые fairness guarantees. Поэтому используйте по одной очереди для каждого рабочего потока, добавляйте новую работу в случайно выбранную очередь, и в случае если очередь конкретного рабочего потока пуста, пусть этот поток берет работу из очереди другого потока.

Такие схемы как правило есть уже готовые.

А вам действительно нужно 200 клиентских потоков?
Re[2]: Multi-producer/multi-consumer задача.
От: BloodyTux  
Дата: 03.10.10 07:34
Оценка:
Здравствуйте, Gurney, Вы писали:

G>Судя по тому, что consumer-ов у вас много, порядок обработки заданий вам не очень важен. Поэтому в исползовании очереди нет необходимости. Только некоторые fairness guarantees. Поэтому используйте по одной очереди для каждого рабочего потока, добавляйте новую работу в случайно выбранную очередь, и в случае если очередь конкретного рабочего потока пуста, пусть этот поток берет работу из очереди другого потока.


G>Такие схемы как правило есть уже готовые.


G>А вам действительно нужно 200 клиентских потоков?



Да, верно, порядок не столь важен. С разделением задач по рабочим потокам понятно, а вот как сделать, чтобы они имели постоянную загрузку?

SergH,
Можно подробнее про два мьютекса на одну очередь, есть ли готовые решения для с++?

Ну насчет 200 я наверное погорячился — вообще система реализована в виде tcp-сервера с threadpool, т.е. грубо говоря потоков может быть и меньше, а вот одновременных запросов от клиентов 200 спокойно.
Re[3]: Multi-producer/multi-consumer задача.
От: Gurney Великобритания www.kharlamov.biz
Дата: 03.10.10 08:07
Оценка:
Здравствуйте, BloodyTux, Вы писали:

BT>Здравствуйте, Gurney, Вы писали:


G>>Судя по тому, что consumer-ов у вас много, порядок обработки заданий вам не очень важен. Поэтому в исползовании очереди нет необходимости. Только некоторые fairness guarantees. Поэтому используйте по одной очереди для каждого рабочего потока, добавляйте новую работу в случайно выбранную очередь, и в случае если очередь конкретного рабочего потока пуста, пусть этот поток берет работу из очереди другого потока.




BT>Да, верно, порядок не столь важен. С разделением задач по рабочим потокам понятно, а вот как сделать, чтобы они имели постоянную загрузку?


А что вы подразумеваете под постоянной нагрузкой? Равное разделение нагрузки между потоками?
Re: Multi-producer/multi-consumer задача.
От: ilnar Россия  
Дата: 03.10.10 08:34
Оценка:
Здравствуйте, BloodyTux, Вы писали:

BT>Здравствуйте!


BT>Возникла следующая задача: имеется большое количество клиентских потоков (высокая конкуренция, т.е. порядка 100-200 штук ) и несколько рабочих в зависимости от числа ядер процессора. Клиенты отправляют задания для рабочих потоков (помещают в общую очередь), а потом через некоторое время проверяют выполнено ли задание и забирают результат, если он готов. Основное требование — постоянная загрузка рабочих потоков. Я прикинул, что если скажем 2 рабочих потока будут ломится через тот же мьютекс, что и 200 потоков клиентов, то они будут простаивать. Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной проблемы.


http://www.drdobbs.com/cpp/212201163
http://www.drdobbs.com/cpp/211601363
Re[4]: Multi-producer/multi-consumer задача.
От: BloodyTux  
Дата: 03.10.10 08:37
Оценка:
Здравствуйте, Gurney, Вы писали:

G>А что вы подразумеваете под постоянной нагрузкой? Равное разделение нагрузки между потоками?


Рабочие потоки производят много вычислений, нужно чтобы процессор использовался полностью.
Re[2]: Multi-producer/multi-consumer задача.
От: BloodyTux  
Дата: 03.10.10 08:42
Оценка:
Здравствуйте, ilnar, Вы писали:

I>http://www.drdobbs.com/cpp/212201163

I>http://www.drdobbs.com/cpp/211601363

Спасибо. На вторую статью сам наткнулся ранее. Так значит lock-free ?
Re[3]: Multi-producer/multi-consumer задача.
От: ilnar Россия  
Дата: 03.10.10 09:07
Оценка:
Здравствуйте, BloodyTux, Вы писали:

BT>Здравствуйте, ilnar, Вы писали:


I>>http://www.drdobbs.com/cpp/212201163

I>>http://www.drdobbs.com/cpp/211601363

BT>Спасибо. На вторую статью сам наткнулся ранее. Так значит lock-free ?


пробуйте, по результатам решите
Re[3]: Multi-producer/multi-consumer задача.
От: ilnar Россия  
Дата: 03.10.10 09:10
Оценка:
Здравствуйте, BloodyTux, Вы писали:

BT>Здравствуйте, ilnar, Вы писали:


I>>http://www.drdobbs.com/cpp/212201163

I>>http://www.drdobbs.com/cpp/211601363

BT>Спасибо. На вторую статью сам наткнулся ранее. Так значит lock-free ?


можете еще посмотреть Intel TBB, там есть конкуррентные очереди, а еще модель задач (task) с автоматическим выбором числа потоков на основе числа ядер
Re[3]: Multi-producer/multi-consumer задача.
От: Eye of Hell  
Дата: 03.10.10 10:20
Оценка:

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


Windows: Completion Ports
Linux, MacOS: epoll
Re[3]: Multi-producer/multi-consumer задача.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 04.10.10 06:55
Оценка: +1
Здравствуйте, BloodyTux, Вы писали:

BT>Ну насчет 200 я наверное погорячился — вообще система реализована в виде tcp-сервера с threadpool, т.е. грубо говоря потоков может быть и меньше, а вот одновременных запросов от клиентов 200 спокойно.


threadpool сам по себе содержит очередь задач, вот и используй его же для обработки
Re[2]: Multi-producer/multi-consumer задача.
От: remark Россия http://www.1024cores.net/
Дата: 24.10.10 06:47
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>При таком количестве потоков вас уже ниче не спасет.


При таком — каком? Большом? Пора бы уже войти в эпоху многоядерных процессоров


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Multi-producer/multi-consumer задача.
От: remark Россия http://www.1024cores.net/
Дата: 24.10.10 06:53
Оценка:
Здравствуйте, BloodyTux, Вы писали:

> Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной проблемы.


Lock-free спасёт от блокировки рабочих потоков.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Multi-producer/multi-consumer задача.
От: remark Россия http://www.1024cores.net/
Дата: 24.10.10 06:54
Оценка:
Здравствуйте, ilnar, Вы писали:

I>можете еще посмотреть Intel TBB, там есть конкуррентные очереди, а еще модель задач (task) с автоматическим выбором числа потоков на основе числа ядер


Там медленная блокирующая очередь.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Multi-producer/multi-consumer задача.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.10.10 17:43
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, gandjustas, Вы писали:


G>>При таком количестве потоков вас уже ниче не спасет.


R>При таком — каком? Большом? Пора бы уже войти в эпоху многоядерных процессоров


R>


Даже 200 потоков, это сильно больше среднего числа процессоров. Затраты на переключение все еще ненулевые.
Re[4]: Multi-producer/multi-consumer задача.
От: remark Россия http://www.1024cores.net/
Дата: 24.10.10 18:09
Оценка:
Здравствуйте, gandjustas, Вы писали:

R>>При таком — каком? Большом? Пора бы уже войти в эпоху многоядерных процессоров


G>Даже 200 потоков, это сильно больше среднего числа процессоров. Затраты на переключение все еще ненулевые.


Современные ОС вполне способны держать по 10 логических потоков на 1 физический поток без видимых издержек. Итого получаем, если у нас 4 12-ти ядерных процессора, примерно 500 потоков будет работать без проблем.
Частота переключения потоков не зависит от их количества. Если у тебя в 10 раз больше потоков, это не значит, что ОС будет их переключать в 10 раз чаще. Частота переключения скорее постоянная.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Multi-producer/multi-consumer задача.
От: Tom Россия http://www.RSDN.ru
Дата: 25.10.10 17:15
Оценка: +1
Здравствуйте, BloodyTux, Вы писали:

BT>Здравствуйте!


BT>Возникла следующая задача: имеется большое количество клиентских потоков (высокая конкуренция, т.е. порядка 100-200 штук ) и несколько рабочих в зависимости от числа ядер процессора. Клиенты отправляют задания для рабочих потоков (помещают в общую очередь), а потом через некоторое время проверяют выполнено ли задание и забирают результат, если он готов. Основное требование — постоянная загрузка рабочих потоков. Я прикинул, что если скажем 2 рабочих потока будут ломится через тот же мьютекс, что и 200 потоков клиентов, то они будут простаивать. Вопрос: спасут ли ситуацию lock-free алгоритмы? Или может быть есть какое-то типовое решение данной

проблемы.

Зачем держать очередь и шедулить работу потоков самому когда для этого придуман пул потоков, который как раз и заботится что бы максимально эффективно нагрузить CPU, и следит за количеством потоков и распределяет им задачи из очереди.
Народная мудрось
всем все никому ничего(с).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.