借助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
借助Docker单机秒开数十万TCP连接的更多相关文章
- 查看 Apache并发请求数及其TCP连接状态
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...
- 查看 并发请求数及其TCP连接状态【转】
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- 查看 并发请求数及其TCP连接状态
服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...
- 查看 Apache并发请求数及其TCP连接状态【转】
查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80& ...
- 查看http的并发请求数及其TCP连接状态
统计80端口的连接数据 netstat -nat | grep -i "80" | wc -l 统计httpd协议连接数 ps -ef | grep httpd | wc -l 统 ...
- 查看http的并发请求数与其TCP连接状态
[root@new-web7 ~ ::]#netstat -na | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}' TIME_WAIT ...
- 查看服务器tcp连接及服务器并发
一.查看哪些IP连接本机netstat -an二.查看TCP连接数1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ...
- 超出TCP连接端口数限制(MaxUserPort)引起的服务器问题
昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80 ...
- 异数OS TCP协议栈测试(三)--长连接篇
异数OS TCP协议栈测试(三)--长连接篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 异数OS TCP长连接技术简介 说起长连接,则首先要谈对 ...
随机推荐
- Flsk-Bootstrap-2
目录 Flsk-Bootstrap-2 结构 解压Bootstrap 制作基础模板 视图函数 初始文件 启动文件 浏览器 Flsk-Bootstrap-2 参考:Flask 项目中使用 bootstr ...
- 【译】索引进阶(八):SQL SERVER唯一索引
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章节我们检查唯一索引.唯一索引的特别之处在于它不仅提供了性能益处,而且提供了数据完整性益处.在SQL SER ...
- technologies
RPC Apache Thrift, Thrift is an interface definition language and binary communication protocol, lik ...
- SignalR在Asp.NetCore中的使用
SignalR简介 ASP.NET SignalR是为ASP.NET 开发人员提供的一个库,旨在为你的Web应用迅速简便的添加实时通信功能.这个Web通信功能是指:客户端可以实时从服务端代码拉取数据, ...
- elasticsearch的CPU居高不下的问题
最近项目中遇到一个令人头疼的问题,毕竟因为工作需要刚学elasticsearch,也没有去关注elasticsearch的配置问题,安装好默认把它当做数据库一样去使用,这导致接下来的项目直接挂掉... ...
- 主席树套树状数组——带修区间第k大zoj2112
主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...
- MySQL慢查询日志汇总
概念: MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lo ...
- 题解 P5315 【头像上传】
本题就是按照题目模拟, 只是要注意一些细节问题. 看代码注释 #include<bits/stdc++.h> using namespace std; int n,l,g,i; int m ...
- js 如何将dom转换为 图片(base64)
1.引入js <script src="https://cdn.bootcss.com/html2canvas/0.4.1/html2canvas.js"></s ...
- python爬虫之如何随机更换User-Agent
python爬虫爬取网站内容时,如果什么也没带,即不带报头headers,往往会被网站管理维护人员认定为机器爬虫.因为,此时python默认的user-agent如Python-urllib/2.1一 ...