Проблема с keepalive

Kirill A. Korinskiy catap+nginx at catap.ru
Fri May 15 19:19:50 MSD 2009


At Fri, 15 May 2009 19:06:24 +0400,
Alexander Sabourenkov <screwdriver at lxnt.info> wrote:
> 
> Здравствуйте.
> 
> Ситуация:
> 
> nginx-0.7.57 FreeBSD 7.2-RELEASE amd64 (E5410 at 2.33GHz x2, 8G, em)
> 
> ~900 запросов в секунду с десятка хостов
> 
> При включенных keepalive практически все запросы идут по 10-15 соединениям, время 
> их жизни явным образом не ограничивается. В результате имеем:
>   - все запросы обрабатываются одним worker-ом
>   - этот worker кушает прилично CPU и памяти, причем со временем всё больше и 
> больше, доедает одно ядро до 100% за примерно час.
>   - все остальные worker-ы отдыхают.
> 
> Подозреваю, что где-то там есть нечто, характеризующееся количеством прошедших 
> запросов по соединению (n), требующее O(n) времени на каждом запросе, O(n) gf и 
> сносимое только при закрытии соединения. Что бы это могло быть?
> 
> Даже если бы оно так не текло, проблема повышения времени ответа worker-a, 
> кушающего 100% CPU из-за небольшого количества таких соединений остается.
> 
> Кроме костыля, аналогичного апачевскому MaxKeepAliveRequests, что-то ничего не 
> приходит в голову.
> 
> С отключенным keepalive полёт нормальный.
> 
> Вопрос, собственно, такой: куда копать?
> 

если вы хотите разбрасывать более равномерно соеденения по воркерам
попробуйте сказать accept_mutex off; в блоке events.

Про frebsd — не знаю, но для Linux — такое поведение
нормально. Т.к. несколько воркеров слушают один сокет — зачем будить
каике-то воркеры, если есть сейчас процесс который может его принять? :)

-- 
wbr, Kirill





More information about the nginx-ru mailing list