熟悉网络编程的都清楚系统只有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# 设置localeENV LANG en_US.UTF-8ENV LANGUAGE en_US:enENV LC_ALL en_US.UTF-8ENV TZ=Asia/ShanghaiRUN mkdir /app_homeRUN echo 'net.ipv4.ip_local_port_range = 8001 65000' >> /etc/sysctl.confWORKDIR /app_homeCOPY client /app_homeRUN chmod +x /app_home/clientENV CLIENT=/app_homeENV 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: testcommand:sh -c "sysctl -p && client -serverAddr=172.16.187.228:28009 -total=35000"restart: alwaysprivileged: 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

转载于:https://www.cnblogs.com/softlin/p/8315203.html

借助Docker单机秒开数十万TCP连接相关推荐

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

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

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

    查看Apache的并发请求数及其TCP连接状态: Linux命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a] ...

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

    [ 2007-7-20 18:30 | by 张宴 ]     [文章作者:张宴 本文版本:v1.1 最后修改:2007.07.27 转载请注明出处:http://blog.s135.com] 这两天 ...

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

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

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

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

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

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 还有ulimit -n 查看linux系统打开最大的文件描述符 ...

  7. 查看docker的tcp连接状态

    #1.查看容器的pid,(去掉undefined,不知道为什么总会显示) docker inspect -f {{.State.Pid}} 容器id   #2.进入容器命令空间,(执行成功,但不会有任 ...

  8. 百万 Go TCP 连接的思考: epoll方式减少资源占用

    强烈推荐: 鸟窝 https://colobu.com/ 百万 Go TCP 连接的思考: epoll方式减少资源占用 前几天 Eran Yanay 在 Gophercon Israel 分享了一个讲 ...

  9. linux send 失败_linux高性能网络编程之tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣.socket编程方法提供了SO_SNDBUF.SO_RCVBUF这样的接口来设置连接的读写缓存,li ...

最新文章

  1. python和javascript哪个好_JavaScript与Python:主要区别
  2. zigbee 空中消息溯源
  3. rs485如何使用_12个经典问答:带你全面了解RS485接口知识
  4. react学习(17)----ant design格式化日期
  5. 论文浅尝 - ACL2020 | 通过集成知识转换进行多语言知识图谱补全
  6. html htc控件详解,*.HTC 文件的简单介绍-网页设计,HTML/CSS
  7. 转:Dilphi基础教程
  8. axios 上传文件 封装_axios 封装【满足常规数据上传及file上传】
  9. 防火墙的访问控制策略
  10. dvi接口少4针_DVI接口针脚数量,详细图文资料介绍
  11. PR2019中对基本图形mogrt文件进行文件夹分类不再混乱
  12. 复刻《三体》雪地工程?德国天文学家开发出全新星际导航系统
  13. thinkphp引入阿里云视频点播
  14. 基于scrapy-redis的分布式腾讯新闻爬虫
  15. Cadedce Allegro 里面怎么切线删除一条线上的某一段
  16. 向公司爱康宣传栏投稿:回顾过去,展望未来
  17. ENVI气溶胶反演相关示例教材
  18. 打砖块游戏代码 java swing
  19. 2020年国内外风电发展规模及风电场建设情况[图]
  20. C++ boost::lexical_cast

热门文章

  1. Python 技术篇-3行代码搞定图像文字识别,pytesseract库实现
  2. Beats Studio3录音师手机音源配置,听出好声音,听出震撼效果!勇士限量款评测!
  3. Python 用smtplib库发邮件报错:[WinError 10061] 由于目标计算机积极拒绝,无法连接。解决办法
  4. Y1ng‘s BabyCode
  5. [YTU]_2738 指针练习--变量交换
  6. cross--向量或矩阵的叉乘
  7. 阅读文献的三大问题:坐不住,记不住,想不开
  8. 多协程实例分析(一)
  9. 震惊!!用图形界面装B居然只需要短短110行代码!!
  10. LeetCode:3. Longest Substring Without Repeating Characters