最大MQTT连接

时间:2015-03-30 23:52:01

标签: activemq tcp-ip mqtt apollo hivemq

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

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

我无法通过600k连接限制。因为在客户端和服务器上似乎没有任何O / S限制(大量的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

对于阿波罗: export APOLLO_ULIMIT = 20000000

对于ActiveMQ:

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

我在客户端为eth0创建了20个额外的私有地址,然后分配它们: ip addr add 11.22.33.44/24 dev eth0

我完全了解65k端口限制,这就是我做上述操作的原因。

  • 对于ActiveMQ,我得到:574309
  • 对于阿波罗,我得到:592891
  • 对于兔子,我得到了90k,但是伐木很糟糕,虽然我知道它有可能,却无法弄清楚该怎么做才能走得更高。
  • 对于Hive,我的试用期限为1000.等待许可
  • IBM希望交换我家的成本来使用它们 - 不!

1 个答案:

答案 0 :(得分:4)

<强>解答: 执行此操作时,我意识到我在/etc/sysctl.conf文件中的客户端设置中拼写错误:net.ipv4.ip_local_port_range

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


更多信息: 试图隔离这是O / S连接限制还是Broker,我决定编写一个简单的客户端/服务器。

服务器:

    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