2015-03-30 93 views
6

我需要创建一个服务器场,它可以处理500万以上的连接,500万以上的主题(每个客户端一个),处理300k条消息/秒。最大MQTT连接

我试图查看各种消息代理的能力,因此我目前使用两个RHEL EC2实例(r3.4xlarge)来创建大量可用资源。所以你不需要查看它,它有16vCPU,122GB RAM。我在使用上远远没有这个限制。

我无法通过600k连接限制。由于在客户端和服务器上似乎没有任何操作系统限制(大量的RAM/CPU等),这些限制了我的工作吗?

我已经编辑/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_ULIMIT = 20000000

For ActiveMQ:

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

我创建20个附加专用地址的客户端在eth0,然后指派他们: IP地址添加11.22.33.44/24 dev的eth0的

我充分认识到65000个端口限制这就是为什么我做以上。

  • 对于ActiveMQ的我练到:574309
  • 阿波罗练到:592891
  • 兔我到90K,但记录是可怕和无法弄清楚做什么去,虽然我高知道它的可能性。
  • For Hive我得到1000的试用限制。等待许可证
  • IBM想要交易我家的成本来使用它们 - 不!
+0

真的不能告诉如何增加吞吐量。但是,结帐http://kafka.apache.org/。不确定关于MQTT支持,但它似乎能够处理极端吞吐量/#客户端。 – 2015-03-31 07:52:08

+0

你尝试过蚊子吗? (http://mosquitto.org/) – 2015-04-02 08:02:29

+0

尝试蜂巢,阿波罗,蚊子,活跃,兔子,蚊子 – redboy 2015-04-02 21:58:28

回答

4

答: 虽然这样做,我意识到,我在我的客户一个拼写错误的/etc/sysctl.conf文件中设置:net.ipv4.ip_local_port_range

我现在能够连接956,591 MQTT客户端在188秒内到我的Apollo服务器。


更多信息: 试图孤立,如果这是一个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 IPS,我希望65535-1024 * 21 = 1354731是边界。在现实中,我能够实现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 

因此,套接字/内核/ io的东西是制定出来的。

我仍然无法使用任何经纪人实现此目的。

再次在我的客户端/服务器测试后,这是内核设置。

客户:

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

服务器:

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

我们尝试了不同的平台,无论CPU/RAM如何,我们无法超越阿波罗的20K连接。我们正在运行一个测试mqTT客户端(使用Paho库)来打开连接。有什么建议么? – 2017-01-31 13:06:27

+0

我们观察到的是超过20K的连接,新的连接以慢速打开。 CPU使用率,服务器内存受到控制。我们也尝试运行来自不同主机的客户端。同样的结果。 – 2017-02-01 04:17:22