Re: оптимизация системы для nginx

calculator на land.ru calculator на land.ru
Ср Фев 17 23:00:24 MSK 2010



Gena Makhomed пишет:
> On 17.02.2010 18:40, calculator at land.ru wrote:
>
>> worker_processes 8;
>> worker_connections 16384;
>
> 16384 * 8 == 65536 * 2
>
>> fs.file-max = 65536
>
> fs.file-max - это system file descriptor limit.
> 65536 может быть слишком мало для веб-сервера.
Это боевые параметры. При тестах задирал разные sysctl и ulimits раза в 
2 - не помогло.
>
> текущее использование дескрипторов
> можно посмотреть в sysctl fs.file-nr
>
> кроме лимита на всю систему в CentOS есть лимит
> по умолчанию на каждый процесс: 1024 дескриптора.
>
> с помощью выполнения команды ulimit -n 16384
> в init-script`е этот лимит можно увеличить.
В бою стоит 32768
>
> кстати, в новых версиях nginx уже есть проверка,
> что RLIMIT_NOFILE не меньше чем worker_connections.
>
>>>> При определенной посещаемости nginx перестает отдаваться. В netstat
>>>> ругань на "times the listen queue of a socket overflowed".
>
> NNN times the listen queue of a socket overflowed
>
> новые запросы поступают быстрее, чем сервер успевает
> их обрабатывать
Это понятно. Но почему это происходит?
> и backlog сокета переполняется.
>
> количество Active connections можно посмотреть в nginx-status
> документация: http://wiki.nginx.org/NginxHttpStubStatusModule
Собран без статуса. Но есть разная статистика из netstat и 
/proc/net/sockstat на момент затыка:
    3675 active connections openings
    8500 connections established

sockets: used 1639
TCP: inuse 45066 orphan 11198 tw 728804 alloc 45549 mem 39833
UDP: inuse 6
RAW: inuse 0
FRAG: inuse 0 memory 0

Еще по sysctl в бою и в момент затыка:
-fs.dentry-state = 21863        19036   45      0       0       0
+fs.dentry-state = 47590        25559   45      0       0       0
 fs.file-max = 65536
-fs.file-nr = 1504      0       65536
-fs.inode-state = 24308 4923    0       0       0       0       0
-fs.inode-nr = 24308    4923
+fs.file-nr = 20736     0       65536
+fs.inode-state = 46775 1667    0       0       0       0       0
+fs.inode-nr = 46775    1665
>
> >>> nginx с дебагом ругается:
> >>> 2010/02/11 14:05:52 [info] 27879#0: *53029559 recv() failed (104:
> >>> Connection reset by peer) while reading client request line, client:
> >>> 92.37.202.227, server: www.site.ru
> >>> 2010/02/11 14:05:52 [info] 27879#0: *53029559 writev() failed (32:
> >>> Broken pipe) while reading client request line
>
> он не ругается, там уровень info. если backlog действительно большой,
> то клиенты просто уставали ждать ответа от сервера и уходили с сайта.
>
>>>> Процессы nginx'а висят примерно пополам в sleep/run.
>>>> Если рядом к примеру на 81 порт запустить еще 1 nginx, он хорошо
>>>> отдается.
>>>> somaxconn и backlog выкручены.
>
> for pid in $(pgrep nginx) ; do cat /proc/$pid/limits ; done | grep open
>



Подробная информация о списке рассылки nginx-ru