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

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

背景


前面我们已经介绍了使用 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


参考


github.com/yedf/handy


zhuanlan.zhihu.com/p/21378825


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

相关文章
|
9月前
|
安全 网络安全 数据安全/隐私保护
解决SSH测试连接GitHub时出现“connection closed by remote host”的问题。
然后使用 `ssh -T git@ssh.github.com`来测试连接。
1087 0
|
druid Java 数据库连接
【YashanDB 知识库】druid 连接池做断网测试,无法自动重新连接
【YashanDB 知识库】druid 连接池做断网测试,无法自动重新连接
|
druid Java 数据库连接
【YashanDB知识库】druid连接池做断网测试,无法自动重新连接
【YashanDB知识库】druid连接池做断网测试,无法自动重新连接
|
监控 API 开发工具
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
|
关系型数据库 MySQL 数据库
6-2|测试连接数据库的命令
6-2|测试连接数据库的命令
|
网络协议 Windows
在电脑上测试TCP/UDP端口是否开放,还是得网络大佬这招厉害!
在电脑上测试TCP/UDP端口是否开放,还是得网络大佬这招厉害!
4791 2
|
网络协议 网络安全 Python
电脑中 TCP/UDP 端口是否开放的测试:令人意想不到的神奇策略等你发现!
【8月更文挑战第19天】在网络管理和维护中,常需确认TCP/UDP端口是否开放以确保服务运行顺畅。端口如同计算机对外通信的“门”,TCP提供可靠连接,UDP则快速但无连接。测试端口是否开放的方法多样:可用`telnet`测试TCP端口,如`telnet localhost 80`;UDP测试较复杂,可用`nc`工具,如`nc -u -z localhost 53`。此外,也有在线工具可供选择,但需确保其安全性。
3597 1
|
网络协议 Ubuntu
百万并发连接的实践测试01
百万并发连接的实践测试01
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
1170 0