Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Август 16, 2012, 22:48



Название: Каково максимальное количество открытых портов?
Отправлено: virtual_root от Август 16, 2012, 22:48
Доброго времени суток! Возник такой вопрос:
Собираюсь писать сервер, который должен принимать соединения от клиентов. Каждому клиенту выделяется свой сокет, новый поток и новый порт по которому с ним будет происходить общение. Вопрос в следующем: предположим подключилось 5000 клиентов(такое возможно, но редко))). Как будет себя вести линуксовый сервер, позволит ли он открыть мне соединения по 5000 портам и обмениваться с ними данными?
Ребята, заранее извините, если вопрос глупый, но нужен ваш совет)


Название: Re: Каково максимальное количество открытых портов?
Отправлено: LisandreL от Август 16, 2012, 23:46
Порты-то откроются, а вот 5000 потоков в одном приложение ОС вам вряд ли позволит запустить без дополнительных настроек.
А даже если и настроите, то всё равно в итоге ваше приложение будет заниматься только переключением потоков.
Так что лучше пересмотрите концепцию.


Название: Re: Каково максимальное количество открытых портов?
Отправлено: QCasper от Август 17, 2012, 01:20
На 5000 портов нужно немного потюнить лимиты, в этом случае ограничение по количеству открытых файловых дескриптов на процесс. Смотрите такие слова как ulimit -n и setrlimit.
Поток на каждого клиента заводить Вам не нужно совершенно точно. Проектируйте систему так, чтобы все тяжёлые операции выполнялись в отдельных потоках в количестве равном количеству ядер. А в основном потоке выполняйте постановку задач этим рабочим потокам.


Название: Re: Каково максимальное количество открытых портов?
Отправлено: ecspertiza от Август 17, 2012, 08:54
А если уж хочется рассматривать концепцию сокеты в потоках, то уж совсем плохо на один сокет один поток, по хорошему 100 сокетов на поток, хотя можно ввести настроечу для вориации этой цыфры, что бы сравнить производительность.


Название: Re: Каково максимальное количество открытых портов?
Отправлено: QCasper от Август 17, 2012, 10:35
А если уж хочется рассматривать концепцию сокеты в потоках, то уж совсем плохо на один сокет один поток, по хорошему 100 сокетов на поток, хотя можно ввести настроечу для вориации этой цыфры, что бы сравнить производительность.
Абсолютно нет никакой связи количества сокетов с количеством потоков. Практика, логика и здравый смысл подсказывают, что исходить надо из количества потоков, которые процессор может одновременно обрабатывать. Если у процессора 4 ядра с HT, то потоков скорее всего будет около 8-ми. Любые попытки сильно завысить эту цифру ни к чему не приведут, а то и ухудшат дело.


Название: Re: Каково максимальное количество открытых портов?
Отправлено: ecspertiza от Август 17, 2012, 11:24
нужно подумать как это можно было бы проверить, все же к цыфрам больше доверия :) Может как вариант, открыть 1000 - 5000 сокетов с разным количеством потоков, и на каждый сокет послать по 100 сообщений, и посчитать среднее время отклика. Чет интересно стало, нужно бы попробовать вечерком :)


Название: Re: Каково максимальное количество открытых портов?
Отправлено: QCasper от Август 17, 2012, 13:52
нужно подумать как это можно было бы проверить, все же к цыфрам больше доверия :) Может как вариант, открыть 1000 - 5000 сокетов с разным количеством потоков, и на каждый сокет послать по 100 сообщений, и посчитать среднее время отклика. Чет интересно стало, нужно бы попробовать вечерком :)

Ну так я же не просто так говорю, а потому что проверял уже. И за 100 сообщений Вы ничего не увидете :) Такие бенчмарки обычно миллионами сообщений исчисляются :)
Вот ещё, посмотрите любопытную статью по теме: http://blog.virtan.com/2012/07/million-rps-battle.html


Название: Re: Каково максимальное количество открытых портов?
Отправлено: LisandreL от Август 17, 2012, 13:57
Практика, логика и здравый смысл подсказывают, что исходить надо из количества потоков, которые процессор может одновременно обрабатывать.
Не надо быть столь уж категоричным. Многое зависит от кода выполняемого в потоке. Если потоки спят / ждут в мьютексах / ждут ввода, то количество потоков равное количеству ядер не даст максимальной производительности.


Название: Re: Каково максимальное количество открытых портов?
Отправлено: xokc от Август 17, 2012, 14:51
Каждому клиенту выделяется свой сокет, новый поток и новый порт по которому с ним будет происходить общение.
Не в плане критики, просто интересно самому: а зачем каждому клиенту свой собственный порт выделять?


Название: Re: Каково максимальное количество открытых портов?
Отправлено: Fat-Zer от Август 17, 2012, 15:45
меня, вот, терзают смутные сомнения, а не станет ли poll узким местом при таком количестве клиентов... и может и правда два/несколько потоков для приёма соединений будут быстрее?

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


Название: Re: Каково максимальное количество открытых портов?
Отправлено: ecspertiza от Август 17, 2012, 15:54
Ну так я же не просто так говорю, а потому что проверял уже. И за 100 сообщений Вы ничего не увидете :) Такие бенчмарки обычно миллионами сообщений исчисляются :)
Вот ещё, посмотрите любопытную статью по теме: http://blog.virtan.com/2012/07/million-rps-battle.html

Любопытная статейка, если я все верно понял то nodejs не так уж и плох ))))


Название: Re: Каково максимальное количество открытых портов?
Отправлено: QCasper от Август 17, 2012, 18:59
Если потоки спят / ждут в мьютексах / ждут ввода, то количество потоков равное количеству ядер не даст максимальной производительности.

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