2015-03-30 13 views
6

Ich muss eine Serverfarm erstellen, die mehr als 5 Millionen Verbindungen bewältigen kann, 5 Millionen Themen (eines pro Client), 300.000 Nachrichten pro Sekunde verarbeiten.Max MQTT-Verbindungen

Ich habe versucht zu sehen, was verschiedene Message-Broker waren, also verwende ich derzeit zwei RHEL EC2-Instanzen (r3.4xlarge), um viele verfügbare Ressourcen zu machen. Sie müssen also nicht nachsehen, es hat 16VCPU, 122GB RAM. Ich bin bei der Verwendung dieser Grenze nicht annähernd.

Ich bin nicht in der Lage, die Grenze von 600k Verbindungen zu bestehen. Da es weder auf dem Client noch auf dem Server eine O/S-Beschränkung gibt (viel RAM/CPU/etc.), Was schränkt mich ein?

habe ich bearbeitet /etc/security/limits.conf wie folgt:

* soft nofile 20000000 
* hard nofile 20000000 

* soft nproc 20000000 
* hard nproc 20000000 

root soft nofile 20000000 
root hard nofile 20000000 

ich bearbeitet haben /etc/sysctl.conf wie folgt:

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 

Für Apollo: Export APOLLO_ULIMIT = 20000000

Für ActiveMQ:

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

I 20 zusätzliche private Adressen für eth0 auf dem Client erstellt, dann zugewiesen: ip addr hinzufügen 11.22.33.44/24 dev eth0

Ich bin voll und ganz der 65k Port Grenzen, weshalb ich tat obenstehendes.

  • Für ActiveMQ Ich habe zu: 574309
  • Für Apollo ich bekam: 592891
  • Für Kaninchen bekam ich auf 90k aber Protokollierung war schrecklich und konnte nicht herausfinden, was obwohl ich höher zu tun, um zu gehen weiß es möglich.
  • Für Hive bekam ich vor Gericht Limit von 1000 eine Lizenz Erwarten
  • IBM die Kosten für mein Haus handeln will, sich zu nutzen - nah!
+0

kann nicht wirklich sagen, wie den Durchsatz zu erhöhen. Allerdings Check-out http://kafka.apache.org/. Nicht sicher über die MQTT-Unterstützung, aber es scheint extrem Durchsatz/# Clients zu ermöglichen. –

+0

hast du mosquitto probiert? (http://mosquitto.org/) –

+0

Probieren Hive, Apollo, Mosquito, Active, Kaninchen, Mücke – redboy

Antwort

4

ANTWORT: Während dies zu tun Ich erkennen, dass ich eine falsche Schreibweise in meinem Klienten hatte in /etc/sysctl.conf Datei Einstellung für: net.ipv4.ip_local_port_range

Ich bin jetzt in der Lage zu verbinden 956.591 MQTT-Clients an meinen Apollo-Server in 188 Sekunden.


Weitere Informationen: Der Versuch, zu isolieren, ob dies eine Einschränkung O/S-Verbindung oder ein Broker, habe ich beschlossen, einen einfachen Client/Server zu schreiben.

Der Server:

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

Der Kunde:

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

Mit 21 IPs, würde ich erwarten, 65535-1024 * 21 = 1354731 die Grenze zu sein.In Wirklichkeit bin ich in der Lage 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 

So ist die Buchse/kernel/io Zeug wird gearbeitet zu erreichen.

Ich bin immer noch nicht in der Lage, dies mit jedem Broker zu erreichen.

Wieder nach meinem Client/Server-Test ist dies die Kernel-Einstellungen.

Auftraggeber:

[[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

Wir versuchten mit verschiedenen Plattformen und unabhängig von der CPU/RAM konnten wir nicht über 20K Verbindungen in Apollo gehen. Wir führen einen Test-mqTT-Client aus (verwendet die Paho-Bibliothek), um Verbindungen zu öffnen. Irgendwelche Vorschläge? –

+0

Was wir beobachten, ist jenseits von 20K-Verbindungen, neue Verbindungen werden mit einer langsamen Rate geöffnet. Die CPU-Auslastung, Speicher im Server sind unter Kontrolle. Wir haben auch versucht, die Clients von verschiedenen Hosts auszuführen. Gleiches Ergebnis. –