背景
前面我们已经介绍了使用 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
。
参考
https://zhuanlan.zhihu.com/p/21378825
以上就是今天的全部内容了,感谢您的阅读,我们下节再会。
评论区