最大 MQTT 连接数
Max MQTT connections
我需要创建一个服务器场,可以处理 5+ 百万个连接、5+ 百万个主题(每个客户端一个)、进程 300k messages/sec。
我试图了解各种消息代理的功能,因此我目前正在使用两个 RHEL EC2 实例 (r3.4xlarge) 来获取大量可用资源。所以你不需要查找它,它有 16vCPU,122GB RAM。我离这个使用限制还差得很远。
我无法超过 600k 的连接限制。因为在客户端和服务器上似乎没有任何 O/S 限制(大量 RAM/CPU/etc。)限制我的是什么?
我已经编辑了 /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
对于 ActiveMQ:
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.UseDedicatedTaskRunner=false"
ACTIVEMQ_OPTS_MEMORY="-Xms50G -Xmx115G"
我在客户端为 eth0 创建了 20 个额外的私有地址,然后分配给它们:
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,我决定写一个简单的 Client/Server.
服务器:
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 的东西已经解决了。
我仍然无法使用任何经纪人实现这一目标。
在我的 client/server 测试之后,这是内核设置。
客户:
[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
我需要创建一个服务器场,可以处理 5+ 百万个连接、5+ 百万个主题(每个客户端一个)、进程 300k messages/sec。
我试图了解各种消息代理的功能,因此我目前正在使用两个 RHEL EC2 实例 (r3.4xlarge) 来获取大量可用资源。所以你不需要查找它,它有 16vCPU,122GB RAM。我离这个使用限制还差得很远。
我无法超过 600k 的连接限制。因为在客户端和服务器上似乎没有任何 O/S 限制(大量 RAM/CPU/etc。)限制我的是什么?
我已经编辑了 /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
对于 ActiveMQ:
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.UseDedicatedTaskRunner=false"
ACTIVEMQ_OPTS_MEMORY="-Xms50G -Xmx115G"
我在客户端为 eth0 创建了 20 个额外的私有地址,然后分配给它们: 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,我决定写一个简单的 Client/Server.
服务器:
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 的东西已经解决了。
我仍然无法使用任何经纪人实现这一目标。
在我的 client/server 测试之后,这是内核设置。
客户:
[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