LINUX.ORG.RU

пул потоков в пуле процессов


0

0

Интересует на сколько эффективна такая модель? То есть когда изначально создаётся пул процессов в каждом из которых создаётся пул потоков. Если числа процессов в пуле не достаточно, то динамически создаётся ещё процесс (в нём тоже создаётся пул потоков) и добавляется к пулу. Интересует вопрос: какое оптимальное число потоков на каждый процесс можно создавать? (понятно, что в одноядерных - 1, в двухядерных - 2 и тд, но оптимально ли это? не жирно ли каждому ядру по потоку отдавать?). Будет ли такая модель эффективнее чем просто пул потоков в одном процессе при большом количестве соединений?


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

trex6 ★★★★★
()

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

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

Alesh
()

честно говоря немного непонятно по терминологии. Для меня пул - это набор каких-либо объектов, которые ждут когда кто-нибудь их возьмёт. Пул процессов - это пул задач, которые ждут, когда их кто-то выполнит? Пул потоков - это тоже какое-то множество задач, отличаемое от процессов реализацией и способом запуска?

rha
()
Ответ на: комментарий от rha

> Пул процессов - это пул задач, которые ждут, когда их кто-то выполнит?

Ждут, когда им подсунут очередную задачку, я так понимаю.

const86 ★★★★★
()

Так, ун во-первый используется язык С и библиотека pthreads. Пишется что то вроде аськи. То есть будет долгий ввод-вывод ожидаться,планирую реализовать это в worker-e с помощью select | poll | epoll, но это именно в воркере.

Когда я говорю пул тредов в пуле потоков, я имею ввиду примерно следющее:

В главном процессе в main происходит примерно такое:

шаг 1 [CODE] for (i = 0; i < MAX_PROCESS; i ++) make_process(i) // создаётся пул процессов

[/CODE]

В свою очередь в make_process:

шаг 2 [CODE] for (i = 0; i < MAX_THREADS; i++) make_thread(i) // создаётся пул потоков, каждый поток дёргает accept, дескриптор полученный аксептом передаётся воркеру worker. [/CODE]

Интересует, будет ли эффективнее эта модель с точки зрения скорости, чем если бы я делал в главном процессе только шаг 2 ?

Ещё хотел узнать, хорошая ли идея уменьшать стек потока при его создании? И ещё то, что написано /proc/sys/kernel/thread-max , следует ли этим руководствоваться при создании пула потоков?

soli
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.