2015-03-30 29 views
6

Ho bisogno di creare una server farm in grado di gestire oltre 5 milioni di connessioni, più di 5 milioni di argomenti (uno per client), elaborare 300k messaggi al secondo.Connessioni MQTT massime

Ho provato a vedere quali vari broker di messaggi erano in grado, quindi attualmente sto utilizzando due istanze RHEL EC2 (r3.4xlarge) per creare molte risorse disponibili. Quindi non hai bisogno di cercarlo, ha 16vCPU, 122 GB di RAM. Non sono affatto vicino a questo limite di utilizzo.

Non riesco a superare il limite di connessioni 600k. Dal momento che non sembra esserci alcuna limitazione O/S (molta RAM/CPU/ecc.) Sul client o sul server, cosa mi limita?

Ho modificato /etc/security/limits.conf come segue:

* soft nofile 20000000 
* hard nofile 20000000 

* soft nproc 20000000 
* hard nproc 20000000 

root soft nofile 20000000 
root hard nofile 20000000 

Ho modificato /etc/sysctl.conf come segue:

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 

Per Apollo: export APOLLO_ULIMIT = 20000000

Per ActiveMQ:

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

ho creato 20 indirizzi privati ​​aggiuntivi per eth0 sul client, quindi assegnato: ip addr aggiungere 11.22.33.44/24 dev eth0

Sono pienamente consapevole dei limiti delle porte 65k ed è per questo che ho fatto quanto sopra.

  • Per ActiveMQ ho avuto modo di: 574309
  • Per Apollo ho avuto modo di: 592891
  • Per Coniglio ho avuto modo di 90k, ma la registrazione era terribile e non riusciva a capire cosa fare per andare più in alto anche se io sappia che è possibile.
  • Per Hive ho raggiunto il limite di prova di 1000. In attesa di una licenza
  • IBM vuole scambiare il costo della mia casa per usarli - nah!
+0

Non posso davvero dire come aumentare il throughput. Tuttavia, checkout http://kafka.apache.org/. Non sono sicuro del supporto MQTT, ma sembra in grado di raggiungere i client di throughput/# estremo. –

+0

hai provato il mosquitto? (http://mosquitto.org/) –

+0

Trying Hive, Apollo, Mosquito, Active, Rabbit, zanzare – redboy

risposta

4

RISPOSTA: Nel fare questo mi sono reso conto che avevo un errore di ortografia nel mio client installando all'interno del file /etc/sysctl.conf per: net.ipv4.ip_local_port_range

sono ora in grado di connettersi 956,591 client MQTT al mio server Apollo in 188 secondi.


Maggiori informazioni: cercando di isolare se questo è un/limitazione di connessione S O o un broker, ho deciso di scrivere un semplice client/server.

Il server:

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

Il Cliente:

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

Con 21 IP, mi sarei aspettato 65.535-1024 * 21 = 1.354.731 di essere il confine.In realtà sono in grado di raggiungere 1231734

[[email protected] 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 

Quindi il socket/kernel/io è stato elaborato.

Sono ANCORA in grado di ottenere questo utilizzando qualsiasi broker.

Ancora una volta dopo il mio test client/server questa è la configurazione del kernel.

Cliente:

[[email protected] 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 

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

Server:

[[email protected] 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 
+0

Abbiamo provato con diverse piattaforme e indipendentemente dalla CPU/RAM, non potevamo andare oltre le connessioni 20K in Apollo. Stiamo eseguendo un client mqTT di test (utilizza la libreria Paho) ​​per aprire le connessioni. Eventuali suggerimenti? –

+0

Ciò che osserviamo è oltre le connessioni 20K, le nuove connessioni vengono aperte a una velocità ridotta. L'utilizzo della CPU, la memoria nel server sono sotto controllo. Abbiamo anche provato a eseguire i client da diversi host. Stesso risultato –