Как настроить 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 тысяч. Но тогда добавление дополнительных записей не позволяет мне выйти за рамки этого количества подключений.

Я уже пробовал сделать ниже:

  1. Наборworker_rlimit_nofileиworker_connectionsдо 999999.
  2. Добавьте больше серверных блоков с разными портами.
  3. 10xtcp_rmem,tcp_wmem,rmem_default,wmem_default,rmem_max,wmem_max.
  4. Параметрmulti_accept on;

Как я могу заставить свой сервер Nginx проксировать более 130 000 подключений (минимум 200 000)?

0 ответов

Другие вопросы по тегам