Re: Ограничение на число одновременных соединений, но с постановкой лишних в очередь
Dmitry Koterov
dmitry на koterov.ru
Пн Ноя 30 03:39:43 MSK 2009
Кстати, если тема представляет еще для кого-то практический интерес,
подключайтесь! (Сорри, что это оффтопик в рассылке nginx.) Я пока нарыл вот
что. В server\mpm\prefork\prefork.c есть кусочек:
/* Set up the pollfd array */
/* ### check the status */
(void) apr_pollset_create(&pollset, num_listensocks, pchild, 0);
for (lr = ap_listeners, i = num_listensocks; i--; lr = lr->next) {
apr_pollfd_t pfd = { 0 };
pfd.desc_type = APR_POLL_SOCKET;
pfd.desc.s = lr->sd;
pfd.reqevents = APR_POLLIN;
pfd.client_data = lr;
/* ### check the status */
(void) apr_pollset_add(pollset, &pfd);
}
Эта штука создает список сокетов, на которых ниже происходит цикл ожидания
активности (причем в этот цикл попадает только один процесс апача, остальные
ждут на мьютексе):
/* timeout == -1 == wait forever */
status = apr_pollset_poll(pollset, -1, &numdesc, &pdesc);
Первый активный сокет будет подхвачен процессом. Так вот, мысль первая: если
в кусочке выше добавлять в список не все сокеты, а только те, лимит
коннектов на которые не превышен, то, теоретически, можно добиться
принудительного ограничения на число коннектов.
Правда, непонятно, что делать, когда число соединений на каком-то сокете
обратно стало меньше порогового. Освободившийся сокет в очередь легко не
пропихнуть... Вернее, можно, конечно, выше в apr_pollset_poll() поставить не
"вечный" тайм-аут, а 1 секунду (плюс новый apr_pollset_create() при
наступлении тайм-аута), тогда он будет заново строить pollset, и вроде как
проблема решается (ценой передергивания очереди раз в секунду).
2009/11/30 Dmitry Koterov <dmitry at koterov.ru>
>
> теоретически - наверное возможно обучить апач параметру SocketMaxConn,
>> но большое количество listening сокетов - это неустранимый недостаток,
>> что может отрицательно сказаться потом на производительности сервера.
>>
>> А что это за параметр, где он устанавливается? Мне сходу не удалось найти
> ничего похожего в системных вызовах...
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20091130/4cc39d95/attachment.html>
Подробная информация о списке рассылки nginx-ru