借助Docker单机秒开数十万TCP连接
熟悉网络编程的都清楚系统只有65535个端口可用,1024以下的端口为系统保留,所以除去系统保留端口后可用的只有65411个端口,而一个TCP连接由TCP四元组(源IP、源端口、TCP、目标IP、目标端口)唯一确定,所以单机一个网卡时客户端最多只能打开65411个TCP连接,而有时我们的TCP服务需要数十万、上百万甚至更多TCP连接的压力测试,这时怎么办呢,通常有几个办法可以解决:挂多网卡、加机器;
1、挂多网卡要是真买网卡这也是个麻烦的事情或许你机器还不支持,还有就是添加虚拟网卡,这倒是不用什么成本,写写脚本或许能解决但也要费不少神;
2、加机器这个成本就比较高了,一台机器开6wTCP连接,压60w就需要开十台这个太麻烦了;
有没有比较简单可行的解决方案只要机器性能满足就能秒开数十万TCP连接呢,这里给出的方案是借助这几年技术圈比较火的Docker,其实这里和上面一点中加虚拟网卡是一样的,只是创建网卡这一步Docker帮我们做了,而且还能秒级启动客户端程序;
流程
原理很简单,发起TCP连接的客户端程序丢到Docker容器中,由于Docker容器使用了Linux的网络名称空间(Network Namespace),容器会自己帮我们创建虚拟网卡,我们不必关系这块,只要配好客户端相关配置启动容器即可;
由于我们是要发起超过6w多个TCP请求连接,而手机启动多个Docker容器也是件麻烦的事情,这里又借助了Docker的一个服务编排的工具Docker Compose这样就可以一键发起数十万TCP请求连接,是要你机器性能满足开多少个连接都没多大问题;
如果服务的TCP通信压力比较大那借助Docker Swarm或Kubernetes使用Docker集群发起TCP连接压测更好;
示例
在Docker宿主机中部署服务端,其实服务端不一定要部署在Docker宿主机中,然后把客户端放在Docker镜像中,启动容器运行该客户端即可;
1、启动服务端:

2、生成镜像且镜像中包含了该客户端程序:
Dockerfile文件内容:
FROM alpine:3.6
# 设置locale
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV TZ=Asia/Shanghai
RUN mkdir /app_home
RUN echo 'net.ipv4.ip_local_port_range = 8001 65000' >> /etc/sysctl.conf
WORKDIR /app_home
COPY client /app_home
RUN chmod +x /app_home/client
ENV CLIENT=/app_home
ENV PATH $CLIENT:$PATH
生成了:solinx.co/market/demo-client:0.1镜像:

3、编写docker-compose.yaml文件:
version: '2'
services:
demo-client:
image: "solinx.co/market/demo-client:0.1"
environment:
TEST: test
command:
sh -c "sysctl -p && client -serverAddr=172.16.187.228:28009 -total=35000"
restart: always
privileged: true
启动容器:docker-compose up -d --scale demo-client=2

当前配置为每个容器中的客户端发起35000个TCP连接,所以服务端连接总数为70000;

当修改scale=3,再次执行:docker-compose up -d --scale demo-client=3,容器将扩容为三个,所以为105000个连接发起TCP连接;

查看当前容器数:

可以说分分钟就发起N多TCP请求,完整的代码示例在github上,需要的自行获取;https://github.com/linxin26/TcpConnectionTest
文章首发地址:Solinx
http://www.solinx.co/archives/1119
借助Docker单机秒开数十万TCP连接的更多相关文章
- 查看 Apache并发请求数及其TCP连接状态
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...
- 查看 并发请求数及其TCP连接状态【转】
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- 查看 并发请求数及其TCP连接状态
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- 查看 Apache并发请求数及其TCP连接状态【转】
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...
- 查看http的并发请求数及其TCP连接状态
统计80端口的连接数据 netstat -nat | grep -i "80" | wc -l 统计httpd协议连接数 ps -ef | grep httpd | wc -l 统 ...
- 查看http的并发请求数与其TCP连接状态
[root@new-web7 ~ ::]#netstat -na | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}' TIME_WAIT ...
- 查看服务器tcp连接及服务器并发
一.查看哪些IP连接本机netstat -an二.查看TCP连接数1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ...
- 超出TCP连接端口数限制(MaxUserPort)引起的服务器问题
昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80 ...
- 异数OS TCP协议栈测试(三)--长连接篇
异数OS TCP协议栈测试(三)--长连接篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 异数OS TCP长连接技术简介 说起长连接,则首先要谈对 ...
随机推荐
- day 22 - 2 面向对象练习
练习一 在终端输出如下信息 小明,10岁,男,上山去砍柴小明,10岁,男,开车去东北小明,10岁,男,最爱大保健老李,90岁,男,上山去砍柴老李,90岁,男,开车去东北老李,90岁,男,最爱大保健老张 ...
- git工具——对比文件的不同
对比工作区和某个版本中文件的不同: (1)继续编辑文件code.txt,在其中添加一行内容: (2)现在要对比工作区中code.txt和head版本中code.txt的不同,使用如下命令: 前面没有出 ...
- Dubbo+Nacos做注册中心和配置中心
项目结构 相关代码 EchoService public interface EchoService { String echo(String msg); } DefaultEchoService @ ...
- TCP 和UDP协议的应用考虑
linux uboot烧写采用的是TFTP协议,是基于UDP的不可靠需要自定义包头包围的网络升级方式. 代码比较简单,容易实现单片机的移植和使用,倒是可以考虑实现一种远程升级的方式. 但是事实上,对于 ...
- LeetCode 21. Merge Two Sorted Lists(c++)
要定义两个链表 判断时依次对应每一个链表的值进行判断即可. /** * Definition for singly-linked list. * struct ListNode { * int val ...
- 【DOS】Win7系统文件夹名太长无法删除问题的解决
一个测试工具产生了几个坑爹文件夹名为n个“x” ,系统提示删除不掉. 网上百度,说什么压缩.写bat文件...统统没用. 猛地看到右击菜单中安装了git客户端工具,想试试看.在该文件夹目录下Git B ...
- Android studio 常见错误修改
一,依赖冲突 All com.android.support libraries must use the exact same version specification (mixing versi ...
- C语言作业3
一.实验目的与要求 1.用for语句实现循环 (1)求数列前n项和 掌握for语句实现循环的方法 (2)求数列前n项和 掌握for语句实现循环的方法 循环嵌套的使用 2.用while循环语句实现循环 ...
- SQLAlchemy使用介绍
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers ...
- 爬虫-request和BeautifulSoup模块
requests简介 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工 ...