URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1901
[ Назад ]

Исходное сообщение
"Проблемы со стеком при БОЛЬШОЙ загрузке сервера"

Отправлено Vladmir7 , 23-Июл-03 16:45 
Сервер запускает на каждого клиента pthread_create. Каждый Тред слушает (select) свои 5-20 сокетов. Нагрузка - 200 клиентов/секунду (и еще планируется нарастить до 500 :). Лимит по количеству открытых файлов вроде как поднят до 8192. (__FD_SETSIZE=8192, в include/bits/typesyzes.h, incude/linux/ limits.h, fs.h, posix_types.h). Операционка Suse Linux 8.2.

И вот все это валится :(
Валится оно из-за запаривания стека.
Что следует из Backtrac-а (gdb) коры: параметр передаваемый сквозняком через несколько функций чудесным образом из 0 стает 14218471987419. Внутри функций параметр гарантировано не меняется.
Вот такая петрушка.

Максимальное значение FD засовуемое в select НЕ привышает 2000-3000 (т.е. еще далеко до 8192).

И еще, насколько я проиграю если перейду с select-а на poll?


Содержание

Сообщения в этом обсуждении
"Проблемы со стеком при БОЛЬШОЙ загрузке сервера"
Отправлено Max V. Zinal , 23-Июл-03 20:17 
>Сервер запускает на каждого клиента pthread_create. Каждый Тред слушает (select) свои 5-20
>сокетов. Нагрузка - 200 клиентов/секунду (и еще планируется нарастить до 500
>:). Лимит по количеству открытых файлов вроде как поднят до 8192.
>(__FD_SETSIZE=8192, в include/bits/typesyzes.h, incude/linux/ limits.h, fs.h, posix_types.h).
>Операционка Suse Linux 8.2.
>

Да вы, батенька, фашист :).
При таком количестве клиентов лучше не создавать гору потоков, а использовать
пул оных относительно небольшого размера (в любом случае не больше, чем
4 x количество_процессоров). При обнаружении по poll() либо select() активности
клиента дескриптор соединения изымается из poll()-select()ных структур и ставится
в очередь, из коей соединения конкурентно выгребают потоки, входящие в пул.
Совершив не слишком крупный квант работы, можно вернуть соединение
на прослушку, дабы обнаружить дальнейшую активность клиента.

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

>И вот все это валится :(
>[...]

Нисколько не удивлён.

>
>И еще, насколько я проиграю если перейду с select-а на poll?

На при переходе на poll() выигрыш разве что в снятии формального ограничения
на число прослушиваемых дескрипторов. Более эффективное решение - /dev/poll.

Успехов.


"Проблемы со стеком при БОЛЬШОЙ загрузке сервера"
Отправлено Murr , 05-Окт-03 15:34 
>На при переходе на poll() выигрыш разве что в снятии формального ограничения
>на число прослушиваемых дескрипторов. Более эффективное решение - /dev/poll.

Не было в Linux никогда /dev/poll. Есть epoll (сейчас).


"Проблемы со стеком при БОЛЬШОЙ загрузке сервера"
Отправлено Leningrad , 05-Окт-03 16:01 
> Более эффективное решение - /dev/poll.

FreeBSD и kqueue