借助Docker单机秒开数十万TCP链接

熟悉网络编程的都清楚系统只有65535个端口可用,1024如下的端口为系统保留,因此除去系统保留端口后可用的只有65411个端口,而一个TCP链接由TCP四元组(源IP、源端口、TCP、目标IP、目标端口)惟一肯定,因此单机一个网卡时客户端最多只能打开65411个TCP链接,而有时咱们的TCP服务须要数十万、上百万甚至更多TCP链接的压力测试,这时怎么办呢,一般有几个办法能够解决:挂多网卡、加机器
  一、挂多网卡要是真买网卡这也是个麻烦的事情或许你机器还不支持,还有就是添加虚拟网卡,这却是不用什么成本,写写脚本或许能解决但也要费很多神;
  二、加机器这个成本就比较高了,一台机器开6wTCP链接,压60w就须要开十台这个太麻烦了;
  有没有比较简单可行的解决方案只要机器性能知足就能秒开数十万TCP链接呢,这里给出的方案是借助这几年技术圈比较火的Docker,其实这里和上面一点中加虚拟网卡是同样的,只是建立网卡这一步Docker帮咱们作了,并且还能秒级启动客户端程序;git

流程

  原理很简单,发起TCP链接的客户端程序丢到Docker容器中,因为Docker容器使用了Linux的网络名称空间(Network Namespace),容器会本身帮咱们建立虚拟网卡,咱们没必要关系这块,只要配好客户端相关配置启动容器便可;
  因为咱们是要发起超过6w多个TCP请求链接,而手机启动多个Docker容器也是件麻烦的事情,这里又借助了Docker的一个服务编排的工具Docker Compose这样就能够一键发起数十万TCP请求链接,是要你机器性能知足开多少个链接都没多大问题;
  若是服务的TCP通讯压力比较大那借助Docker Swarm或Kubernetes使用Docker集群发起TCP链接压测更好;github

示例

  在Docker宿主机中部署服务端,其实服务端不必定要部署在Docker宿主机中,而后把客户端放在Docker镜像中,启动容器运行该客户端便可;docker

  一、启动服务端:编程

  二、生成镜像且镜像中包含了该客户端程序:
  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镜像:app

  三、编写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链接;spa

  查看当前容器数:

  能够说分分钟就发起N多TCP请求,完整的代码示例在github上,须要的自行获取;https://github.com/linxin26/TcpConnectionTest

文章首发地址:Solinx
http://www.solinx.co/archives/1119

相关文章
相关标签/搜索