熟悉网络编程的都清楚系统只有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. python核心编程(多线程编程)

    1.全局解释器锁 2.threading模块 thread类

  2. Moment.js简单使用

    1.设置语言环境,如设置中文环境: moment.locale("zh-cn"); 2.当前时间.指定时间: // 假设当前时间为:2018年12月10日 moment(); // ...

  3. nginx的location配置详解

    语法规则: location [=|~|~*|^~] /uri/ { … } =开头表示精确匹配 ^~开头表示uri以某个常规字符串开头,理解为匹配url路径即可.nginx不对url做编码,因此请求 ...

  4. Oracle XMLTYPE数据类型创建及插入

    --1.创建xml表Create TABLE testxml2(id NUMBER,data XMLTYPE); --2.插入数据--1)创建目录 CREATE or replace DIRECTOR ...

  5. Java版InfluxDB工具类

    InfluxDB工具类 package com.influxdb.test; import java.util.Map; import org.influxdb.InfluxDB; import or ...

  6. asp.net core 的 razor pages 如何使用ajax调用后台方法

    Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时,基于服务器的代码能够创建动态内容. 在网页加载时,服务器在向浏览器返回页面 ...

  7. poj 3268 Silver Cow Party(最短路dijkstra)

    描述: One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the bi ...

  8. LeetCode 7. Reverse Integer(c语言版)

    题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123Output: 321 Ex ...

  9. Robot Framework学习笔记

    robot framework 上个用例的输出作为下个用例的输入 (Set Global Variable的用法) 注意:如果直接在suite里定义变量,变量在suite里的用例里只能应用,修改的效果 ...

  10. git 随笔(随时更新)

    w:跳到下个词前面, e:跳到下个词后面,b是跳到上一个单词前面. v:选择 ,可以批量操作 q + a:  录制宏, a 是存录制地方,q录制完毕. @a :执行录制操作. @a 前面➕数字:例如1 ...