activemq - 最大 MQTT 连接数

标签 activemq tcp mqtt apollo hivemq

我需要创建一个可以处理 5+ 百万个连接、5+ 百万个主题(每个客户端一个)、每秒处理 30 万条消息的服务器场。

我试图了解各种消息代理的功能,因此我目前正在使用两个 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

对于 Apollo : 导出 APOLLO_ULIMIT=20000000

对于 ActiveMQ:

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

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

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

  • 对于 ActiveMQ,我得到:574309
  • 对于 Apollo,我得到了:592891
  • 对于 Rabbit,我达到了 90k,但日志记录很糟糕,虽然我知道它有可能,但我不知道该怎么做才能更高。
  • 对于 Hive,我达到了 1000 的试用限制。正在等待许可证
  • IBM 想用我的房子的成本来换取它们的使用 - 不!

最佳答案

回答: 在执行此操作时,我意识到我在/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

所以套接字/内核/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

关于activemq - 最大 MQTT 连接数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358313/

相关文章:

java - 在 ActiveMQ 中,VM 传输上的网络参数有什么用?

linux - 我如何在 Perl 中接受多个 TCP 连接?

c# - 使用 ip 和端口将 TCP 消息从 dot net 服务器发送到我的 iOS 设备

ssl - Apache camel/MQTT 通过 SSL : Failed to create Producer for endpoint (java. lang.NullPointerException)

asp.net - 使用 ASP.Net 向 MQTT 服务器发送消息

java - ActiveMQ:队列(具有并发消费者)和主题的正确配置

c# - 如何在c++中的activemq mapmessage中设置消息组id

java - 如何确保来自 JMS 队列的消息传递到外部 WebService (CXF)?

java - 为什么我的客户端不再接受输入

java - 如何激活ActiveMQ持久化来抵抗重启?