Максимальное количество соединений MQTT

Мне нужно создать ферму серверов, которая может обрабатывать 5+ миллионов подключений, 5+ миллионов тем (по одной на каждого клиента), обрабатывать 300 тысяч сообщений в секунду.

Я попытался посмотреть, на что способны различные брокеры сообщений, поэтому в настоящее время я использую два экземпляра RHEL EC2 (r3.4xlarge), чтобы получить много доступных ресурсов. Так что вам не нужно его искать, у него 16vCPU, 122GB RAM. Я нигде не приближаюсь к этому пределу в использовании.

Я не могу превысить ограничение в 600 тыс. подключений. Поскольку нет никаких ограничений операционной системы (много ОЗУ/ЦП/и т. д.) ни на клиенте, ни на сервере, что меня ограничивает?

Я отредактировал /etc/security/limits.conf следующим образом:

* soft  nofile  20000000
* hard  nofile  20000000

* soft  nproc  20000000
* hard  nproc  20000000

root  soft  nofile 20000000
root  hard  nofile 20000000

Я отредактировал /etc/sysctl.conf следующим образом:

net.ipv4.ip_local_port_range = 1024 65535  
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_mem = 5242880  5242880 5242880 
net.ipv4.tcp_tw_recycle = 1 
fs.file-max = 20000000 
fs.nr_open = 20000000 
net.ipv4.tcp_syncookies = 0

net.ipv4.tcp_max_syn_backlog = 10000 
net.ipv4.tcp_synack_retries = 3 
net.core.somaxconn=65536 
net.core.netdev_max_backlog=100000 
net.core.optmem_max = 20480000

Для Apollo: экспорт APOLLO_ULIMIT=20000000

Для ActiveMQ:

ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.UseDedicatedTaskRunner=false"
ACTIVEMQ_OPTS_MEMORY="-Xms50G -Xmx115G"

Я создал 20 дополнительных частных адресов для eth0 на клиенте, затем присвоил их: ip addr add 11.22.33.44/24 dev eth0

Я ПОЛНОСТЬЮ осведомлен об ограничениях на 65 тыс. портов, поэтому я сделал это выше.

  • Для ActiveMQ я получил: 574309
  • Для Аполлона я получил: 592891
  • Для Кролика я добрался до 90k, но ведение журнала было ужасным, и я не мог понять, что делать, чтобы подняться выше, хотя я знаю, что это возможно.
  • Для Hive я дошел до пробного лимита в 1000. Жду лицензию
  • IBM хочет обменять стоимость моего дома, чтобы использовать их - нет!

person redboy    schedule 30.03.2015    source источник
comment
Не могу точно сказать, как увеличить пропускную способность. Однако проверьте kafka.apache.org . Не уверен насчет поддержки MQTT, но кажется, что он способен работать с экстремальной пропускной способностью / # клиентов.   -  person Petter Nordlander    schedule 31.03.2015
comment
ты пробовал москит? (mosquitto.org)   -  person yǝsʞǝla    schedule 02.04.2015
comment
Пробный Улей, Аполлон, Комар, Активный, Кролик, комар   -  person redboy    schedule 03.04.2015


Ответы (1)


ОТВЕТ: Делая это, я понял, что в настройках клиента в файле /etc/sysctl.conf была опечатка: net.ipv4.ip_local_port_range.

Теперь я могу подключить 956 591 клиент MQTT к моему серверу Apollo за 188 секунд.


Дополнительная информация: Пытаясь изолировать, является ли это ограничением соединения O/S или брокером, я решил написать простой клиент/сервер.

Сервер:

    Socket client = null;
    server = new ServerSocket(1884);
    while (true) {
        client = server.accept();
        clients.add(client);
    }

Клиент:

    while (true) {
        InetAddress clientIPToBindTo = getNextClientVIP();
        Socket client = new Socket(hostname, 1884, clientIPToBindTo, 0);
        clients.add(client);
    }

С 21 IP-адресом я ожидаю, что 65535-1024*21 = 1354731 будет границей. На самом деле я могу достичь 1231734

[root@ip ec2-user]# cat /proc/net/sockstat
sockets: used 1231734
TCP: inuse 5 orphan 0 tw 0 alloc 1231307 mem 2
UDP: inuse 4 mem 1
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

Итак, материал socket/kernel/io проработан.

Я ВСЕ ЕЩЕ не могу добиться этого с помощью любого брокера.

Опять же, сразу после моего теста клиент/сервер, это настройки ядра.

Клиент:

[root@ip ec2-user]# sysctl -p
net.ipv4.ip_local_port_range = 1024     65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 5242880      5242880 15242880
net.ipv4.tcp_tw_recycle = 1
fs.file-max = 20000000
fs.nr_open = 20000000

[root@ip ec2-user]# cat /etc/security/limits.conf
* soft  nofile  2000000
* hard  nofile  2000000    
root  soft  nofile 2000000
root  hard  nofile 2000000

Сервер:

[root@ ec2-user]# sysctl -p
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 5242880      5242880 5242880
net.ipv4.tcp_tw_recycle = 1
fs.file-max = 20000000
fs.nr_open = 20000000
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_syn_backlog = 1000000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000000
net.core.optmem_max = 20480000
person redboy    schedule 01.04.2015
comment
Мы пробовали на разных платформах, и независимо от ЦП/ОЗУ, мы не смогли превысить 20 тысяч подключений в Apollo. Мы запускаем тестовый клиент mqTT (использует библиотеку Paho) ​​для открытия соединений. Какие-либо предложения? - person Karthik Murugan; 31.01.2017
comment
То, что мы наблюдаем, превышает 20 тысяч подключений, новые подключения открываются с низкой скоростью. Использование ЦП, память на сервере находятся под контролем. Мы также пробовали запускать клиентов с разных хостов. Тот же результат. - person Karthik Murugan; 01.02.2017
comment
@KarthikMurugan Сейчас 2021 год, но вы смогли решить эту проблему? Иметь тот же вариант использования и застрять на 2k соединениях. - person Dhruv Sehgal; 23.06.2021