熟悉网络编程的都清楚系统只有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连接的更多相关文章

  1. 查看 Apache并发请求数及其TCP连接状态

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...

  2. 查看 并发请求数及其TCP连接状态【转】

    服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  3. 查看 并发请求数及其TCP连接状态

    服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  4. 查看 Apache并发请求数及其TCP连接状态【转】

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...

  5. 查看http的并发请求数及其TCP连接状态

    统计80端口的连接数据 netstat -nat | grep -i "80" | wc -l 统计httpd协议连接数 ps -ef | grep httpd | wc -l 统 ...

  6. 查看http的并发请求数与其TCP连接状态

    [root@new-web7 ~ ::]#netstat -na | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}' TIME_WAIT ...

  7. 查看服务器tcp连接及服务器并发

    一.查看哪些IP连接本机netstat -an二.查看TCP连接数1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ...

  8. 超出TCP连接端口数限制(MaxUserPort)引起的服务器问题

    昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80 ...

  9. 异数OS TCP协议栈测试(三)--长连接篇

    异数OS TCP协议栈测试(三)--长连接篇 本文来自异数OS社区 github:   异数OS-织梦师(消息中间件)群: 476260389 异数OS TCP长连接技术简介 说起长连接,则首先要谈对 ...

随机推荐

  1. Linux二进制安装apache2.4.25

    Linux二进制安装apache2.4.25 安装环境:CentOS 6.2 先检查是否安装了Apache 如通是通过rpm包安装的话直接用下面的命令:rpm -q httpd 也可以使用如下两种方法 ...

  2. vue+webpack项目 url的问题了解

    阮一峰js模块化 webpack打包 url-loader vue Loader ES6 模块化  babel成CommonJS规范的实现 能正常显示图片的写法如下, src通过控制台可以看到被web ...

  3. Linux设置允许指定端口通过防火墙centos7

    开启防火墙 1.systemctl start firewalld.service(开启防火墙) 2.systemctl stop firewalld.service(开启防火墙) 3.service ...

  4. The SetStack Computer UVA - 12096

    题意:初始状态的栈内包含一个空集,对栈进行一下操作: PUSH:向栈内压入一个空集 DUP:复制栈顶,并压入栈内 UNION:将栈顶端两个集合出栈,并将两个元素的并集入栈 INTERSECT:将栈顶端 ...

  5. 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析

    2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...

  6. 论文翻译:Neural Networks With Few Multiplications

    目录 Abstract 1. Introduction 2.Related Work 3.Binary And Ternary Connect 3.1 BINARY CONNECT REVISITED ...

  7. php跨域问题记录

    记录跨域问题 一.问题 在控制层加了如下代码: header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN'] ); header('Ac ...

  8. Linux下定时备份文件

    一. 编写脚本 编写一个脚本文件,使脚本可以执行备份命令. 例如,将文件目录 /home/backups/balalala 备份到/home目录下,并压缩. 1. 创建脚本 命令格式: touch 路 ...

  9. 移动端右侧导航 显示隐藏js

    transform与fixed影响 html按钮 <span class="nav-btn"></span> <span class="cl ...

  10. 关于el-upload上传

    <el-upload class="edit-input-upload" :action="config.baseUrl + '/joinus/candidate/ ...