Итак. Чтобы 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
|