Как настроить Nginx для проксирования более 200 тыс. MQTT-соединений?
Мне нужно проксировать множество MQTT-соединений (более 200 000) и распределить их по нескольким портам на внутреннем сервере. Ниже приведена моя конфигурация Nginx.
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
user www-data;
pid /run/nginx.pid;
worker_rlimit_nofile 204800;
worker_cpu_affinity auto;
worker_processes auto;
events {
accept_mutex on; # Multiple workers should accept connection
worker_connections 206200; # Total connections with upstream and clients
multi_accept off; # Accept one connection in each worker
}
stream {
upstream backend {
server backendserver.com:1885;
server backendserver.com:1886;
server backendserver.com:1887;
server backendserver.com:1888;
server backendserver.com:1889;
server backendserver.com:1890;
server backendserver.com:1891;
server backendserver.com:1892;
server backendserver.com:1893;
server backendserver.com:1894;
server backendserver.com:1895;
server backendserver.com:1896;
server backendserver.com:1897;
server backendserver.com:1898;
server backendserver.com:1899;
server backendserver.com:1900;
server backendserver.com:1901;
server backendserver.com:1902;
server backendserver.com:1903;
server backendserver.com:1904;
}
server {
listen 8883;
proxy_pass backend;
}
}
Я также установил следующие конфигурации системы:
sysctl -w fs.file-max=11000000
sysctl -w fs.nr_open=11000000
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.ipv4.ip_local_port_range="1025 65535"
sysctl -w net.ipv4.tcp_mem="100000000 100000000 100000000"
sysctl -w net.ipv4.tcp_rmem='2048 2048 2048'
sysctl -w net.ipv4.tcp_wmem='4096 4096 4096'
sysctl -w net.core.rmem_default=4096
sysctl -w net.core.wmem_default=4608
sysctl -w net.core.rmem_max=4096
sysctl -w net.core.wmem_max=4608
Также я установилulimit -n 999999
.
Но я могу создать только около 128–130 тысяч соединений. После этого Nginx регистрирует ошибки, как показано ниже:
2023/08/16 06:46:32 [error] 4172305#4172305: *206569 recv() failed (104: Unknown error) while proxying and reading from upstream, client: 72.xxx.xxx.xxx, server: 0.0.0.0:8885, upstream: "139.xxx.xxx.xxx:8889", bytes from/to client:984/5224, bytes from/to upstream:5224/984
Я проверил прямое подключение ко всем серверным портам, и они работают нормально.
Более того, когда у меня была только одна запись вupstream backend
блок, я смог создать только около 64 тысяч соединений. Когда я добавляю вторую запись, я могу подняться примерно до 128–130 тысяч. Но тогда добавление дополнительных записей не позволяет мне выйти за рамки этого количества подключений.
Я уже пробовал сделать ниже:
- Набор
worker_rlimit_nofile
иworker_connections
до 999999. - Добавьте больше серверных блоков с разными портами.
- 10x
tcp_rmem
,tcp_wmem
,rmem_default
,wmem_default
,rmem_max
,wmem_max
. - Параметр
multi_accept on;
Как я могу заставить свой сервер Nginx проксировать более 130 000 подключений (минимум 200 000)?