zoukankan      html  css  js  c++  java
  • 借助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

  • 相关阅读:
    PIC基础学习3
    增强WebClient的同步下载功能
    同步模式下的端口映射程序
    .Net并行库介绍——Parallel
    写了一个测试正则表达式的小工具
    Windows 7下的虚拟光驱
    昨天发的一篇帖子竟然上了60天点击排行榜了
    .Net中的Junction Points操作
    在技嘉主板上实现USB启动
    正则表达式测试工具原型完成
  • 原文地址:https://www.cnblogs.com/softlin/p/8315203.html
Copyright © 2011-2022 走看看