目 录CONTENT

文章目录

如何进行千万级TCP连接测试

phyger
2022-03-21 / 1 评论 / 0 点赞 / 1,957 阅读 / 2,877 字 / 正在检测是否收录...

背景

前面我们已经介绍了使用 Jmeter 进行 TCP 海量连接的测试,但是使用 Jmeter 需要分布式模式,而且就算是分布式模式占用资源也很多,所以我们需要一种节省资源且能达到更高规模连接的方式。今天,它来了。

工具介绍

经过小编亲测,此工具可以轻松实现四层 TCP 千万连接数,网上也有人已经实测过。它就是 handy,它是一个简洁易用的 C++网络库,可以实现单机千万并发。

实战

因为 handyCS 架构,所以我们需要在服务端和客户端都安装 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

  1. 使用 ss -s 看到的 TCP 连接数和 netstat -ntlp 的结果是一样的。
  2. 服务端和客户端的机器规格建议使用 16G64G

参考

https://github.com/yedf/handy

https://zhuanlan.zhihu.com/p/21378825

以上就是今天的全部内容了,感谢您的阅读,我们下节再会。

0

评论区