借助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
本文链接:http://www.solinx.co/archives/1119?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SpringBoot开发案例之整合日志管理
概述 参考文档:Logging 这里顺便引用以下部分原文,当然看不明白也没关系,我们有有道翻译,如果翻译的不准确,后面会提供详细配置分享给大家。 SpringBootusesCommonsLoggingforallinternallogging,butleavestheunderlyinglogimplementationopen.DefaultconfigurationsareprovidedforJavaUtilLogging,Log4J2andLogback.Ineachcaseloggersarepre-configuredtouseconsoleoutputwithoptionalfileoutputalsoavailable. Bydefault,Ifyouusethe‘Starters’,Logbackwillbeusedforlogging.AppropriateLogbackroutingisalsoincludedtoensurethatdependentlibrariesthatuseJavaUtilLogging,CommonsLogging,Log4JorSL...
- 下一篇
分布式和集群区别?什么是云计算平台?分布式的应用场景?
分布式是指将一个业务拆分不同的子业务,分布在不同的机器上执行,集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机,一个云计算平台,就是通过一套软件系统把分布式部署的资源集中调度使用。要应对大并发,要实现高可用,既需要分布式,也离不开集群。 分布式和集群区别? 分布式 分布式:是指将一个业务拆分不同的子业务,分布在不同的机器上执行。 集群 集群:是指多台服务器集中在一起,实现同一业务,可以视为一台计算机。 多台服务器组成的一组计算机,作为一个整体存在,向用户提供一组网络资源,这些单个的服务器就是集群的节点。 两个特点 可扩展性:集群中的服务节点,可以动态的添加机器,从而增加集群的处理能力。 高可用性:如果集群某个节点发生故障,这台节点上面运行的服务,可以被其他服务节点接管,从而增强集群的高可用性。 集群分类 常用的集群分类 1.高可用集群(High Availability Cluster) 高可用集群,普通两节点双机热备,多节点HA集群。 2.负载均衡集群(Load Balance Cluster) 常用的有 Nginx 把请求分发给后端的不同web服务器,还有就是数据库集...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群