LINUX.ORG.RU

Очередь vs мультипоточность


0

0

Расклад такой: есть сервер, принимающий и обрабатывающий запросы от клиентов. Принимает через сокет, и пока обрабатывается один запрос, все новые принимаются и отправляются в очередь.

Но внезапно я озадачился вопросом, что же будет быстрее - один процесс с очередью в 10 запросов, или два процесса, но по пять? И это при условии что система однопроцессорная и одноядерная.

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

★★★★★

Смотря что ты подразумеваешь под обработкой запроса. Если чисто вычисления - может и имеет смысл однопоточность. Но если есть ожидание (в т.ч. завершения ввода-вывода), то лучше несколько потоков.

Так что есть обработка запроса?

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

>Так что есть обработка запроса?

Там и вычисления, и общение с базой. Но вычисления занимают в несколько раз больше времени, чем ввод/вывод.

kranky ★★★★★
() автор топика
Ответ на: комментарий от kranky

Тогда мне кажется, что будет выигрыш от некольких потоков (двух?). Потому что вычисления второго будут идти тогда, когда идет ввод-вывод первого.

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

Лучше просто проверь. Надо чтобы не было блокировок одного потока из-за второго, иначе профита может и не быть.

Pavval ★★★★★
()

Очередь Вам рано или поздно может выйти боком. Представьте ситуацию, когда клиент сделал запрос и отвалился ничего не сказав (нет FIN, нет RST). Тогда сервер попытается отвечать и будет это делать примерно 10 минут (настройки tcp по умолчанию). Вам это надо?

ansky ★★★★★
()
Ответ на: комментарий от Pavval

>Надо чтобы не было блокировок одного потока из-за второго, иначе профита может и не быть.

В теории быть не должно, но таки потестирую, да.

kranky ★★★★★
() автор топика
Ответ на: комментарий от ansky

>Представьте ситуацию, когда клиент сделал запрос и отвалился ничего не сказав (нет FIN, нет RST). Тогда сервер попытается отвечать и будет это делать примерно 10 минут (настройки tcp по умолчанию).

Не, такого не возникнет, ибо я не держу tcp-соединение пока сервер рожает результат (потому что иногда это очень долго). Клиент сам возвращается через какое-то время и спрашивает, готов ли результат =)

kranky ★★★★★
() автор топика

Одна очередь и два процесса, берущие запросы из этой очереди по одному. Нэ?

Obey-Kun ★★★★★
()

FSM per core/CPU

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

>... Но если есть ожидание (в т.ч. завершения ввода-вывода), то лучше несколько потоков.

Это не всегда так. man poll/select

pathfinder ★★★★
()

> Очевидно, что первый способ экономнее по памяти

У тебя запросы огромного размера?

но вот какой из них быстрее?

Зависит от соотношения нагрузки на ЦП и В/В.

Короче, очередь + конфигурируемое количество процессов, читающих из этой очереди.

tailgunner ★★★★★
()

тред читал по диагонали и через слово, но…

всё зависит :)

зависит от объёма свободной памяти… точнее, от объёма памяти, которое вы согласны принести в жертву своему демону :) организовав полностью асинхронный в/в (т.е. POLLIN/POLLOUT через соотв. буфера) можно даже через poll сделать профит перед мультитредной версией. а если epoll заюзать… ;)

/* речь о монопроцессорной системе, если что */

arsi ★★★★★
()

На однопроцессорной системе может и можно получить чуть больше производительность за счет io, но это решение некрасивое, грязноватое. Лучше кошерная очередь.

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