У меня есть сервер Linux с приложением Erlang, которое показывает нечетное ограничение в 65536 макс. Входящих соединений TCP.
Приложение Erlang написано на платформе Cowboy.
Я настроил параметры ядра таким образом:
/etc/sysctl.conf:
# Increase system file descriptor limit
fs.file-max = 300000
# Discourage Linux from swapping idle processes to disk (default = 60)
vm.swappiness = 10
# Increase Linux autotuning TCP buffer limits
# Set max to 16MB for 1GE and 32M (33554432) or 54M (56623104) for 10GE
# Don't set tcp_mem itself! Let the kernel scale it based on RAM.
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.optmem_max = 40960
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Make room for more TIME_WAIT sockets due to more clients,
# and allow them to be reused if we run out of sockets
# Also increase the max packet backlog
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
# Disable TCP slow start on idle connections
net.ipv4.tcp_slow_start_after_idle = 0
# Disable source routing and redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
# Log packets with impossible addresses for security
net.ipv4.conf.all.log_martians = 1
/etc/security/limits.conf:
* soft nofile 300000
* hard nofile 300000
Я также проверил максимальное количество процессов Erlang, но это не кажется ограничивающим фактором:
1> erlang:system_info(process_limit).
262144
Тестовые соединения выполняются 4 клиентскими машинами с 4 разных IP-адресов (так что это не проблема с ограничениями клиентов), и после начальной аутентификации соединения остаются простаивающими, поэтому загрузка ЦП сервера ниже 50%, а использование памяти - также ниже 35%.
РЕДАКТИРОВАТЬ: я не уверен, важно ли это: приложение сервера Erlang прослушивает порт 8000, и я также заставляю его прослушивать порт 80 с помощью этого правила iptables:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
На что еще нужно обратить внимание, чтобы снять ограничение на 65536 подключений?
Если ваши 4 разных клиента подключаются к серверу с одного и того же хоста, у вас не может быть более 65536 активных входящих подключений одновременно, поскольку вы можете сгенерировать только 65536 портов для одного и того же входящего IP-адреса.
Проверьте, как написано ваше приложение. Существует ограничение в 65535 портов, и порты в этом диапазоне: 0-1024 зарезервированы.
Если ваше приложение использует эфемерный порт; из RFC-6056
- Эфемерные порты
2.1. Ассортимент традиционных эфемерных портвейнов
Управление по присвоению номеров в Интернете (IANA) назначает уникальный
параметры и значения, используемые в протоколах, разработанных в Интернете
Инженерная рабочая группа (IETF), включая известные порты [IANA].
IANA зарезервировала следующее использование диапазона 16-битных портов TCP
и UDP:o Известные порты, от 0 до 1023.
o Зарегистрированные порты, с 1024 по 49151
o Динамические и / или частные порты, с 49152 по 65535
Динамический диапазон портов, определенный IANA, состоит из диапазона 49152-65535 и предназначен для выбора эфемерных портов.
На последнем шаге спросите поставщика, является ли это жестко запрограммированным значением. (int_16)
Я обнаружил проблему после просмотра вывода dmesg:
nf_conntrack: table full, dropping packet
Итак, проблема заключалась в перенаправлении TCP 80 => 8000 с использованием iptables.
Я удалил это правило iptables и заставил Erlang напрямую прослушивать оба порта 80 и 8000, а ограничение в 65k было снято.