zoukankan      html  css  js  c++  java
  • 单机千万级MQTT连接服务器测试报告

    目标:测试创建1000万客户端连接到服务器端,服务器操作系统 Linux(任意一款发行版服务器版本)。分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器。在硬件一致的情况下请确保网络设备达到相关测试要求,例如万兆网络等等。

    服务器硬件配置

    Dell Inc.
    型号	PowerEdge R430
    CPU	8 CPUs x Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
    内存	64 GB //测试客户端机器内存升级到96 GB

    需要测试千万级连接,确保测试工具独占服务器,并硬件内存大于或等于256GB,由于测试硬件资源受限,以400万连接数据测试结果作为参考依据,单机千万连接完全有可能达到。当商业应用时需要考滤高连接的self-ddos问题,应该尽量设置更长的客户端keepalive值。

    服务端系统参数调优(Linux)

    修改文件/etc/sysctl.conf,配置网络参数。

    net.ipv4.tcp_wmem = 4096 87380 4161536
    net.ipv4.tcp_rmem = 4096 87380 4161536
    net.ipv4.tcp_mem = 786432 2097152 3145728
    fs.file-max = 12000000 #一千两百万
    

    执行/sbin/sysctl -p即时生效。

     
    echo 12000000 > /proc/sys/fs/nr_open #需root权限

    /etc/systemd/system.conf 设置服务最大文件句柄数:

     
    DefaultLimitNOFILE=12000000

    修改/etc/security/limits.conf文件

    * hard nofile 12000000
    * soft nofile 12000000
    * soft nproc 12000000
    * hard nproc 12000000

    需重启系统生效,服务器操作系统参数调优完成。关于启动CP7服务器端程序请参阅本章中的《程序安装》小节

    客户端的参数调优(Linux)

    根据TCP/IP协议,由于端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,所以能分配的端口只是1024到65534,也就是64511个。一台机器一个IP只能创建六万多个长连接。 要想达到更多的客户端连接,可以用更多的机器或者网卡,也可以使用虚拟IP来实现,比如下面的命令增加了19个IP地址,其中一个给服务器用,其它18个给client,这样可以产生18 * 60000 = 1080000个连接。本测试用例需要增加到一千万或以上的足够IP。

    root@:~# ifconfig
    eth0 Link encap:Ethernet HWaddr 00:16:3e:0b:2e:a0
    inet addr:x.x.x.x Bcast:x.x.x.x Mask:255.255.240.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:4706185 errors:0 dropped:0 overruns:0 frame:0
    TX packets:4705832 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:1005604068 (1.0 GB) TX bytes:5556912863 (5.5 GB)
     
    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:65536 Metric:1
    RX packets:5875416 errors:0 dropped:0 overruns:0 frame:0
    TX packets:5875416 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1
    RX bytes:3566710813 (3.5 GB) TX bytes:3566710813 (3.5 GB)

    以上指令查看到网卡名称为 eth0

     
    ifconfig eth0:0 192.168.77.10 netmask 255.255.255.0 up
    ifconfig eth0:1 192.168.77.11 netmask 255.255.255.0 up
    ifconfig eth0:2 192.168.77.12 netmask 255.255.255.0 up
    ifconfig eth0:3 192.168.77.13 netmask 255.255.255.0 up
    ifconfig eth0:4 192.168.77.14 netmask 255.255.255.0 up
    ifconfig eth0:5 192.168.77.15 netmask 255.255.255.0 up
    ifconfig eth0:6 192.168.77.16 netmask 255.255.255.0 up
    ifconfig eth0:7 192.168.77.17 netmask 255.255.255.0 up
    ifconfig eth0:8 192.168.77.18 netmask 255.255.255.0 up
    ifconfig eth0:9 192.168.77.19 netmask 255.255.255.0 up

    以上指令操作增加虚拟IP,添加完成后通过 ifconfig 指令查看确认所有虚拟IP最已列出。

    修改/etc/sysctl.conf文件:

     
    fs.file-max = 12000000
    fs.nr_open = 12000000
    net.ipv4.ip_local_port_range = 1024 65535

    执行/sbin/sysctl -p即时生效。

     
    echo 12000000 > /proc/sys/fs/nr_open #需root权限

    /etc/security/limits.conf配置

     
    * soft nofile 12000000
    * hard nofile 12000000
    * soft nproc 12000000
    * hard nproc 12000000
    使用Coolpy7_benchmark测试客户端测试四百万级连接
     
    # 下载测试工具
    git clone https://github.com/Coolpy7/coolpy7_benchmark.git
    # 进入bin文件夹
    cd bin
     
    # 启动Coolpy7静连接测试工具
    # 参数url: Coolpy7服务端所在服务器ip地址,默认端口号:1883
    # 参数workers: 需要创建的客户端连接数量
    # 参数cid: mqtt连接客户端(ClientId)前缀,工具会自动以cid+WorkersId作为连接clientid值
    # 参数topic: 连接成功后订阅的topic主题(支持以%i取得workersid:例: mytopic%i)不进行订阅测试填写null字符串
    # 参数keepalive: 连接ping时间间隔
    # 参数clear: mqtt客户端连接的clearsession属性,当设置为true时重连时不能再次订阅qos0以上的主题
    # 以下例示建立连接到192.168.200.238所在的Coolpy7服务器端,并创建400万个MQTT客户端连接
    ./go_build_cp7_bench_sub_go_linux -workers=4000000 -cid=tqy -topic=null -qos=0 -url=tcp://192.168.200.238:1883 -keepalive=60000s -clear=true
     

    客户端连接数

    系统使用内存

    RES使用内存

    VIRT使用内存

    CPU使用

    网络(进)

    网络(出)

    100万

    4.5G

    2633M

    2789M

    260/1600

    2.8M

    2M

    200万

    10.3G

    4009M

    4152M

    277/1600

    2.98M

    2.15M

    300万

    14.7G

    5517M

    5682M

    278/1600

    3.05M

    2.21M

    400万

    19.3G

    7055M

    7231M

    270/1600

    2.91M

    2.18M

    测试时需时刻关注服务器端网络资源使用情况,测试数据显示在高连接数下ping/pong状态下已占用极大的网络带宽,需根据当前设备的硬件资源合理设置最大连接数量以保证系统的稳定长期运行

    相关测试截图
    服务器端启动并host于1883 TCP端口
    通过HTOP工具监测Coolpy7(连接时)硬件资源占用情况
    通过NLOAD工具监测Coolpy7(连接时)网络资源占用情况
    使用Coolpy_benchmark工具测试连接400万连接
     

    从服务器端的硬件资源使用情况得出结论单机千万级连接即可实现,如阁下有相关硬件设备实测千万级用例,请把测试结果告知Coolpy7官方。感谢!

    1. 工具会以1000为单位打印连接信息

    2. 工具启动后会一直创建参数指定的客户端连接数

    按应用场景测试

    MQTT 是一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。1个字节报头、2个字节心跳、消息 QoS 支持等设计,非常适合在低带宽、不可靠网络、嵌入式设备上应用。

    不同的应用有不同的系统要求,用户使用Coolpy7消息服务器前,可以按自己的应用场景进行测试,而不是简单的连接压力测试:

    1. Android 消息推送: 推送消息广播测试。

    2. 移动即时消息应用: 消息收发确认测试。

    3. 智能硬件应用: 消息的往返时延测试。

    4. 物联网数据采集: 并发连接与吞吐测试。

  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/jacle169/p/10551062.html
Copyright © 2011-2022 走看看