LINUX.ORG.RU

[TCP/IP] Как «увеличить» очередь для входящих соединений ?


0

0

Начал разбиратся с сетевым программированием и не все понятно. Возьмем к примеру модель многопоточного сервера:

msock=listen(sock,20) while (1) { ssock=accept( msock,... ) pthread_create(...., ssock) }

Модель когда каждому присоединению выделяется отдельный поток. Поток при обрыве соединения закрывает сокет и сам завершается. При таком поведениии очередь для входящих соединений в конце концов исчерпается. Можно ли как-нибудь "нарастить" очередь для входящих соединений после завершения потока? Как в этом случае поступают "настоящие" серверы ? Что посоветуете почитать на эту тему ?


Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

Параметр backlog у listen'а задает максимальное количество соединений, ожидающих accept'а. После accept'а соединение из этой очереди соответственно удаляется.

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

DrLivsy
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

Коль скоро уж вы начали разбираться с сетевым программированием и многопоточными серверами:

Создавать по потоку на каждое входящее соединение это нерационально.

Kpoxman ★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

> Создавать по потоку на каждое входящее соединение это нерационально.

зависит от задач. Апач-то как-то работает. В некоторых случаях это идеально, напеример, если обработка запроса не занимает много времени. ТОгда тред обработал запрос, отдал ответ и дальше пощёл принимать соединения. Понятное дело, при медленных клиентах это загнётся :). Зато поддержка SMP сразу появляется и никакого гемора с асинхронным io. Короче, на c10k, вроде, это было всё расписано.

true_admin ★★★★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

>> Как в этом случае поступают "настоящие" серверы ?

"Настоящие" серверы держат пул потоков фиксированной длины с таймаутами и поток-диспетчер акцептующий соединения и разруливающий их по первому попавшемуся потоку из пула. Это если на пальцах...

cathode
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

> Апач не создает поток на каждого клиента насколько я знаю.

ты не прав, почитай про apache mpm

true_admin ★★★★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

Соединения покидают очередь backlog в момент accept().
Ничего наращивать не нужно.

alexsaa
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

enlarge your backlog!

dilmah ★★★★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

> При таком поведениии очередь для входящих соединений в конце концов исчерпается.

Какие симптомы? Может быть, просто дескриптор корректно не закрываете? Короткий бэклог будет мешать уже в боевом применении, в случае "начал разбираться с сетевым программированием" маловероятно, что наступите.

mv ★★★★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

почитал. и worker, и prefork, и winnt создают пул процессов/потоков которым отдаются на исполнение запросы.

т.е. на каждого клиента поток не создается, хотя кол-во потоков/процессов может увеличиваться при увеличении кол-ва соединений.

sergej ★★★★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

> т.е. на каждого клиента поток не создается

Каждого клиента обслуживает свой отдельный поток. А создан ли поток заранее или при accept это, в данном случае, не важно.

true_admin ★★★★★
()

Re: [TCP/IP] Как "увеличить" очередь для входящих соединений ?

не, я понимаю, что я нуден и придираюсь к словам, но изначально было сказано "_создает_ поток на _каждого_ клиента" :)

ладно, забили...

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