Re: [РЕШЕНО] Nginx & comet: Как принять более 64K одновременных соединений ...

Eugene Batogov johnbat26 на gmail.com
Вт Дек 7 16:08:06 MSK 2010


Итак. Чтобы Linux и NGINX обеспечивал более 64 K соединений необходимо:

1. Уровень ядра Linux ( /etc/syctl.conf):
 1.1 Проверить параметр  fs.file-max:
....
# Максимальное значение открытых файлов. Что бы его узнать, выполните
# команду cat /proc/sys/fs/file-max
fs.file-max = 999999
....

 1.2 Необходимо увеличить параметр, контролирующий максимальное количество осиротевших сокетов: tcp_max_orphans
...
# Переменная задает максимальное число осиротевших (не связанных ни с
# одним процессом) сокетов. Если это число будет превышено, то такие
# соединения разрываются, а в системный журнал пишется предупреждение. Это
# ограничение существует исключительно ради предотвращения простейших
# разновидностей DoS-атак.
net.ipv4.tcp_max_orphans = 300000
...
 1.3 Запрещаем кеширование статуса ssthresh (были ретрансмиты) для других соединений
   net.ipv4.tcp_no_metrics_save = 1

 1.4 rp_filter
#Включает/выключает reverse path filter («проверка обратного адреса» – хотя это слишком вольный перевод термина, 
#но мне он кажется наиболее близким по смыслу. прим. перев.) для заданного интерфейса. 
#Смысл этой переменной достаточно прост – все что поступает к нам проходит проверку на соответствие исходящего адреса с нашей таблицей маршрутизации 
#и такая проверка считается успешной, если принятый пакет предполагает передачу ответа через тот же самый интерфейс. 
#Переменная может иметь два значения – 0 (выключено) и 1 (включено). Значение по-умолчанию – 0 (выключено)
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
...

2. Уровень подсистемы безопасности Linux:
  Файл:  /etc/security/limits.conf
...
#<domain>      <type>  <item>         <value>
*                      soft        nofile          300000
*                      hard      nofile          300000
...

3. Уровень nginx:
Файл: /etc/nginx/nginx.conf:
.....
worker_rlimit_nofile 300000;
events {
    worker_connections  50000;
    use epoll;
}
...
Выдержка их документации по NGINX:

syntax: worker_rlimit_nofile число
default: нет
context: main
Директива изменяет ограничение на число используемых файлов RL1IMIT_NOFILE для рабочего процесса. Используется для увеличения ограничения без перезапуска 
основного процесса. 

worker_connections  50000; - максимальное количество соединений для одного worker.

В тесте давал  80000 соединений по 40000 c двух серверов. 
Затем отправил сообщение всем для проверки глобальных реконнектов.

При иследовании зоны насыщения оказалось, что при привышении 100K сервер перестает отвечать на запросы.
В логах на этот раз ничего нет.  Тут надо копать дальше. 

loadaverage: 0.05
Каждый worker отъел ~ -60-115 Mb.
Всего workers: 8. 

Кто что скажет по этому вопросу?
Что еще можно проанализировать?
Жду конструктивной критики.
P.S. Характеристики сервера во вложении
-- 
Best Regards, Eugene Batogov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20101207/9eba9952/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lshw.log
Type: text/x-log
Size: 6580 bytes
Desc: not available
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20101207/9eba9952/attachment-0001.bin>


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