Не хватает диапазона ip_local_port_range

123 4
D
На сайте с 07.11.2000
Offline
219
3163

ОС: Дебиан.

99% запросов - статика, файлы 4-10Кб, отдаются nginx-ом.

Нагрузка до 1500-1700 обращений в секунду (записей в логе в секунду).

В sysctl стоит

net.ipv4.ip_local_port_range="1024 65500"

Также установлены в "единицу" reuse, recycle.

Периодически при пиковой нагрузке - не могу достучаться до сайта. В этот момент по "ss -s" видно, что не хватает диапазона: 1024-65500.

Все остальное в норме:

nginx = 4 процесса по 4-5% нагрузки на каждое ядро CPU (4 ядра в системе),

диск - до 5% (в основном, запись лога большими блоками; объем файлов значительно меньше ОЗУ сервера - поэтому все это закешировано осью в памяти),

загруженность канала -- 100-120 Мбит (т.е. есть запас).

Как быстро побороть в пиковые моменты (редко), не устанавливая второй сервер?

pupseg
На сайте с 14.05.2010
Offline
347
#1

у вас 65500 одновременных соединений ?

эти соединения что-то делают или просто держат открытым сокет ?

Качественная помощь в обслуживании серверов. (/ru/forum/661100) Бесплатных консультаций не даю, не помогаю, не обучаю. Минималка от 100$. Как пропатчить KDE-просьба не спрашивать. Есть форумы (http://linux.org.ru) и полезные сайты (http://www.opennet.ru/).
lonelywoolf
На сайте с 23.12.2013
Offline
151
#2

Dimka, 10 кило, по 1700 штук в секунду не должны создавать такое количество подключений. Это означает, что странички отдаются довольно таки долго. На вскидку можно предложить выключение keepalive и:

multi_accept on;
tcp_nodelay on;
tcp_nopush on;
Платный и бесплатный хостинг с защитой от DDoS (http://aquinas.su)
esetnod
На сайте с 16.07.2009
Offline
134
#3

HTTP 1.1 и keepalive до бэкэнда пробовали?

Быстрый хостинг на SSD от $0.99 (http://just-hosting.ru/) | OpenVZ (http://just-hosting.ru/vds.html) и KVM (http://just-hosting.ru/vds-kvm.html) VDS от $7.95
N
На сайте с 06.05.2007
Offline
419
#4

Dimka, самое очевидное решение - закупить еще IP и в DNS отдавать сразу пачку.

Ну а пока таймауты для TIME_WAIT можно понизить.

В этот момент по "ss -s" видно, что не хватает диапазона:

это статистика аж с момента перезапуска.

А на самом деле правильно ли вы оцениваете остроту этой проблемы ? Просто посчитайте все типы строчек соединений в netstat .

Плагины для систем мониторинга есть соответствующие чтобы этот ресурс графически представить . Например вот - http://munin-monitoring.org/browser/munin-contrib/plugins/network/tcp-states

Кнопка вызова админа ()
D
На сайте с 07.11.2000
Offline
219
#5

Кроме добавления второго IP, может в конфигах что-то изменить?

Конфиг nginx 1.8

worker_processes  4;

worker_rlimit_nofile 240000;
worker_priority -10;


events {
worker_connections 16384;
}

http {
server_tokens off;
server_names_hash_bucket_size 64;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

proxy_read_timeout 25s;
proxy_connect_timeout 20s;
keepalive_timeout 60 22;
send_timeout 30s;
client_body_timeout 12s;
client_header_timeout 12s;
reset_timedout_connection on;
...}

sysctl

net.ipv4.conf.all.rp_filter=1

net.ipv4.icmp_echo_ignore_broadcasts=1
fs.file-max = 256000

net.core.rmem_default=262144
net.core.wmem_default=262144

net.core.rmem_max = 16777216
net.core.wmem_max = 33554432

net.ipv4.tcp_rmem = 4096 873800 16777216
net.ipv4.tcp_wmem = 4096 655360 16777216

vm.swappiness=10
vm.vfs_cache_pressure=1000

net.ipv4.tcp_synack_retries = 3
net.ipv4.ip_local_port_range = 1024 65500
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 14

net.core.netdev_max_backlog=10000
net.ipv4.tcp_keepalive_time=1200

net.ipv4.tcp_keepalive_intvl=20
net.ipv4.tcp_keepalive_probes=7

net.ipv4.tcp_max_tw_buckets=720000


---------- Добавлено 05.03.2016 в 21:51 ----------

lonelywoolf:
На вскидку можно предложить выключение keepalive и:

отключить keepalive вообще или уменьшить время? Остальное включено.

N
На сайте с 06.05.2007
Offline
419
#6
Dimka:
keepalive_timeout 60 22;

явно есть куда уменьшать это в nginx.

даже если это хостинг картинок, уместно будет и 5-10 секунд.

Опять же, в присутствии мониторинга состояний nginx можно было бы более уверенно рассуждать. Допустим, видно было бы сколько живых запросов, а сколько keep-alive сделать выводы о соотношении и насколько это общее число соединений приближается к критическому 64k. Сделайте мониторинг.

N
На сайте с 06.05.2007
Offline
419
#7
Dimka:
net.ipv4.ip_local_port_range="1024 65500"
Периодически при пиковой нагрузке - не могу достучаться до сайта. В этот момент по "ss -s" видно, что не хватает диапазона: 1024-65500.

По-моему, вы с неправильного вывода начали и всех запутали.

Этот лимит вам вообще мешать не должен. Чистому серверу http ведь эти порты вообще не нужны. Все входящие имеют значение локального порта = 80.

Это может оказывать влияние только если у вас еще и apache или еще какие-то необычные штуки требующие на каждое подключение исходящих подключений куда-то.

Может подробнее опишете ? Покажете этот самый netstat ss -s ?

Хотя все советы остаются в силе. В любом случае в такой нагруженной машине надо уменьшать число соединений как-нибудь, а worker_connections увеличивать.

И надо бы проверить не включен ли conntrack в iptables. Не нужен он, а лимит подключений создает равный net.ipv4.netfilter.ip_conntrack_max создает.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#8

И самое главное: что в syslog сыпется от ядра, что вы его параметры тюнить начали? Какие ошибки?

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Andron_buton
На сайте с 19.07.2007
Offline
270
#9

Эти таймауты можно прописать или еще меньше сделать


net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3
D
На сайте с 07.11.2000
Offline
219
#10
netwind:
Этот лимит вам вообще мешать не должен. Чистому серверу http ведь эти порты вообще не нужны. Все входящие имеют значение локального порта = 80.

Где-то меня в интернет-советах ввели в заблуждение :) Ориентировался на фразу из интернета:

"max clients is also limited by the number of socket connections available on the system (~64k)"

видимо, ошибочно?

И судя по "69883 ESTABLISHED"(ниже) - вы правы, это выше 65К

netwind:
Покажете этот самый netstat ss -s ?

Сейчас вечер - на сервере спокойно (и наплыв с проблемами бывает редко).

Сейчас,

netstat при высоком keepalive 600 в nginx:

69883 ESTABLISHED

3694 TIME_WAIT

416 FIN_WAIT2

338 LAST_ACK

104 SYN_RECV

92 CONNECTED

46 FIN_WAIT1

37 CLOSING

1 servers)

1 I-Node

при keepalive 4:

21949 TIME_WAIT

3992 ESTABLISHED

3192 FIN_WAIT2

709 FIN_WAIT1

449 LAST_ACK

188 CONNECTED

113 SYN_RECV

50 CLOSING

1 servers)

1 I-Node

---------- Добавлено 07.03.2016 в 17:09 ----------

netwind:
И надо бы проверить не включен ли conntrack в iptables. Не нужен он, а лимит подключений создает равный net.ipv4.netfilter.ip_conntrack_max создает.

Если я правильно проверял, то выключен. И "не найдено" для net.ipv4.netfilter.ip_conntrack_max

---------- Добавлено 07.03.2016 в 17:27 ----------

netwind:
Опять же, в присутствии мониторинга состояний nginx можно было бы более уверенно рассуждать. Допустим, видно было бы сколько живых запросов, а сколько keep-alive

Подскажите, что именно отслеживать? Поставил munin и добавил плагин nginx_status.

---------- Добавлено 07.03.2016 в 17:30 ----------

netwind:
worker_connections увеличивать.

Поставил 20480 (для 4 worker_processes ). Или можно смело ставить 51200*4?

Возможны проблемы с производительностью при больших значениях worker_connections?

---------- Добавлено 07.03.2016 в 18:21 ----------

Andron_buton:
Эти таймауты можно прописать или еще меньше сделать
Цитата:
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3

Установил. Еще установил

net.ipv4.tcp_keepalive_time=600

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий