背景
前面我们已经介绍了使用 Jmeter 进行 TCP 海量连接的测试,但是使用 Jmeter 需要分布式模式,而且就算是分布式模式占用资源也很多,所以我们需要一种节省资源且能达到更高规模连接的方式。今天,它来了。
工具介绍
经过小编亲测,此工具可以轻松实现四层 TCP 千万连接数,网上也有人已经实测过。它就是 handy,它是一个简洁易用的 C++网络库,可以实现单机千万并发。
实战
因为
handy是CS架构,所以我们需要在服务端和客户端都安装handy。
很重要
因为 Linux 的文件句柄数和端口都有限制,所以我们先要把服务端和客户端的这些限制修改到最大。简单起见,测试前执行如下命令即可:
sysctl -w fs.file-max=10485760 sysctl -w net.ipv4.tcp_rmem=1024 sysctl -w net.ipv4.tcp_wmem=1024 sysctl -w net.ipv4.ip_local_port_range='1024 65535' sysctl -w net.ipv4.tcp_tw_recycle=1 sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_timestamps=1 echo '* soft nofile 1048576' >> /etc/security/limits.conf echo '* hard nofile 1048576' >> /etc/security/limits.conf ulimit -n 1048576 复制代码
依赖下载
yum install -y gcc gcc-c++ 复制代码
handy 下载安装
# Github地址: https://github.com/yedf/handy # 下载: 可以直接clone代码下来,也可以下载已经release的最新版本。 # 小编选择了release的版本,下载后是个tar.gz包 ls handy-0.2.0.tar.gz # 解压安装 tar -zxvf handy-0.2.0.tar.gz cd handy-0.2.0 make && make install 复制代码
启动服务端
# 查看当前所在路径 pwd /root/handy-0.2.0 # 查看服务端命令参数 10m/10m-svr usage: 10m/10m-svr <begin port> <end port> <subprocesses> <management port> # 启动服务端 nohup 10m/10m-svr 100 300 10 301 & # 命令参数解释 301:多进程的管理端口 10:启动10个子进程 100 300:进程监听100到300端口 # 查看服务端进程 ps -ef | grep 10m root 49999 33523 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50000 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50001 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50002 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50003 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50004 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50005 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50006 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50007 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50008 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50009 49999 0 15:27 pts/1 00:00:00 10m/10m-svr 100 300 10 301 root 50015 33523 0 15:27 pts/1 00:00:00 grep --color=auto 10m 复制代码
客户端启动测试
# 客户端命令参数 10m/10m-cli usage 10m/10m-cli <host> <begin port> <end port> <conn count> <create seconds> <subprocesses> <hearbeat interval> <send size> <management port> # 客户端命令 10m/10m-cli 192.168.1.1 100 300 10000000 500 10 600 64 301 # 命令解释 301:多进程管理端口 64:信条数据64字节 600:600秒发送一次心跳 10:10个客户端进程 500:500秒完成所有连接 10000000:建立10000000万连接 100 300:连接服务端的100到300端口 第一个为方服务端的IP地址 # 执行命令后观察服务端的TCP连接数 watch -n 1 -d ss -s ############################### Every 1.0s: ss -s Thu Jun 3 15:33:25 2021 Total: 40002 (kernel 40035) TCP: 39632 (estab 37623, closed 2, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 40035 - - RAW 0 0 0 UDP 3 2 1 TCP 39630 39626 4 INET 39633 39628 5 FRAG 0 0 0 ################################ Every 1.0s: ss -s Thu Jun 3 15:33:50 2021 Total: 242961 (kernel 243015) TCP: 242600 (estab 240579, closed 2, orphaned 12, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 243015 - - RAW 0 0 0 UDP 3 2 1 TCP 242598 242594 4 INET 242601 242596 5 FRAG 0 0 0 复制代码
500 秒内客户端将会完成 1000万 的 TCP 连接,如上,测试 25 秒已经完成了 24万 连接。
Tips
- 使用
ss -s看到的TCP连接数和netstat -ntlp的结果是一样的。 - 服务端和客户端的机器规格建议使用
16G64G。
参考
以上就是今天的全部内容了,感谢您的阅读,我们下节再会。