Задать вопрос
@AlexWinner

Нет ответа от сервера c nginx на некоторые syn?

Добрый день.

Столкнулся со следующей ситуацией.

Есть сервер с Debian Squeeze, на нём установлен nginx 0.7.67 (из репозитория).

В принципе, всё работает без проблем, но заметили, что иногда не получается приконнектиться к порту. SYN приходит, ответа нет.

Пробовал включить syncookies, это несколько помогло (в логах вылезли ошибки про «possible SYN flooding on port 80. Sending cookies.»). Но всё равно были проблемы с коннектом. Синфлуда при этом нет, это просто много легального трафика.

После этого, увеличил следующие параметры:

net.core.somaxconn = 128000<br>
net.core.netdev_max_backlog = 10000<br>
net.ipv4.tcp_max_syn_backlog = 128000<br>
'

У нжинкса увеличил listen backlog до 65536.



Сообщения про «possible SYN flooding» исчезли, однако всё равно периодически не приконнектится к серверу. Проверял простеньким скриптом, который поднимает 20 тредов и открывает и закрывает сокеты к 80-му порту в каждом треде.

Из 1000 попыток открыть сокет около 30-50 отваливаются по таймауту (2 секунды), остальные при этом коннектятся практически мгновенно.



При всём этом в dmesg пусто, в error.log нжинкса тоже пусто.



Кусок конфига нжинкса:

user                    www-data;<br>
worker_processes        2;<br>
worker_rlimit_nofile    65535;<br>
error_log               /var/log/nginx/error.log;<br>
pid                     /var/run/nginx.pid;<br>
<br>
events {<br>
        worker_connections              65535;<br>
        use                             epoll;<br>
}<br>
server {<br>
    listen 80 default backlog=65536;<br>
.....<br>
}<br>




На сервере 2 ядра, LoadAverage держится меньше единицы.



В netstat'e примерно такая картина:

# netstat -ant | grep tcp | tr -s ' ' ' ' | awk '{print $6}' | sort | uniq -c<br>
     22 CLOSING<br>
   3729 ESTABLISHED<br>
    815 FIN_WAIT1<br>
   3807 FIN_WAIT2<br>
    138 LAST_ACK<br>
      5 LISTEN<br>
    167 SYN_RECV<br>
     37 SYN_SENT<br>
   1104 TIME_WAIT<br>




В stub_status'e нжинкса:

Active connections: 5985 <br>
server accepts handled requests<br>
 35200 35200 34437 <br>
Reading: 341 Writing: 223 Waiting: 5421 <br>


На всякий случай — SYNы до сервера точно доходят, снимал tcpdump, в нём они видны.



Подскажите, пожалуйста, что смотреть, куда копать, кто сталкивался?
  • Вопрос задан
  • 6308 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@AlexWinner Автор вопроса
В итоге помогли большие бэклоги и выключенные синкуки:
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_syncookies = 0
net.core.somaxconn = 262144


nginx.conf:
user www-data;
worker_processes 4;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
        worker_connections 65535;
        use epoll;
}
...
server {
           listen 80 default backlog=65000;
...
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
opium
@opium
Просто люблю качественно работать
У вас всего два worker_processes
и worker_connections 65535;
если у вас очень много легального трафика то может просто не влезает?
Увеличьте worker_processes
Ответ написан
AterCattus
@AterCattus
Люблю быстрый backend
По приведенным логам этого не сказать, но может поможет увеличение nf_conntrack?
Это немного из другой оперы, но вдруг.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект