c10k,c100k,c1000k等问题大家都已经司空见惯,那么10m(千万)并发连接呢?今天就来一起挑战一下。
下面我们使用handy库自带的例子程序,来跑出一个单机千万并发连接的实例,先上操作步骤,后面解释。

准备机器

10m连接,大家的个人电脑肯定无法满足要求,如果不是在大公司任职,弄个实际的物理机对大家是个奢望。那么怎么办?我也面临同样问题。
现在的云计算这么发达,还可以按小时计费,一小时的费用也就几元,那就试试云计算产品吧。小编先是在阿里云上测试,但阿里云的按需付费主机配置不高,费了不少时间,最终只跑到了3m个连接。阿里云的不行,是主机的配置问题还是程序的问题呢?为了得到最终的结论,我尝试了其他的云产品,最终ucloud的云主机给了我兴奋的答案。

首先创建ucloud主机
ucloud主机(一共需要两台,一台作为服务器,一台作为客户端):
. 选择主机管理的创建主机
. 系统选择ubuntu14.4 64bit (小编的测试程序是c++11,需要高版本的g++)
. 机型标准版
. 网络增强一定要选择开启 (千万连接是网络IO密集型,网络当然要强大型)
. cpu 16核 内存64G 数据盘0
. 下一步中的网络类型选择基础网络即可,创建主机之后,需要购买弹性ip,并且绑定到主机
. 价格:小编实验时,上述的配置,一台仅需7.2元一小时,两台不到15元

做实验的时候,大家记得要眼疾手快哦,一小时十几元,获得了自己想要的结果就赶紧释放主机哈

调整系统参数

10m并发连接对系统是个挑战,需要调整相关的参数

sysctl -w fs.file-max=10485760 #系统允许的文件描述符数量10m
sysctl -w net.ipv4.tcp_rmem=1024 #每个tcp连接的读取缓冲区1k,一个连接1k,10m只需要10G
sysctl -w net.ipv4.tcp_wmem=1024 #每个tcp连接的写入缓冲区1k
sysctl -w net.ipv4.ip_local_port_range='1024 65535' #修改默认的本地端口范围
sysctl -w net.ipv4.tcp_tw_recycle=1 #快速回收time_wait的连接
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
echo '* soft nofile 1048576' >> /etc/security/limits.conf #用户单进程的最大文件数,用户登录时生效
echo '* hard nofile 1048576' >> /etc/security/limits.conf #用户单进程的最大文件数,用户登录时生效
ulimit -n 1048576 #用户单进程的最大文件数 当前会话生效
部署程序

下面可以开始部署我们的测试程序了

apt-get update

apt-get install -y screen git make g++ nload iptraf

git clone https://github.com/yedf/handy

cd handy

git checkout 97b5426f91d37

make -j4

运行测试程序

选取一台主机S作为服务器,运行服务器
10m/10m-svr 100 300 10 301 #启动10个子进程,每个进程分别监听100-300的端口

选取另一台主机C作为客户端,运行客户端,(需要填写S的内网ip)
10m/10m-cli 100 300 10000000 500 10 600 64 301 #启动10个客户端子进程,每600秒发送一个心跳

观察结果

然后,10m连接的建立就不需要更多的步骤啦,使用命令
watch ss -s
我们就可以开始观察连接的创建进度啦,看着连接渐渐的往上走,超过10k,100k, 1m是不是很有成就感。

说明

并发连接数到达千万时,有诸多方面的问题需要解决:

. 单进程最大文件数量限制:limit -n 最多能把这个数字修改到1048575,因此单个进程最多能够打开百万个文件,千万并发连接需要千万个文件描述符,于是我们使用多进程来做到千万文件的支持

.多进程之间的负载均衡:nginx使用多进程来增加自己的吞吐量,采用共享锁的方式来平衡负载,对核数较多的服务器,较多的进程并没有达到性能的线性提升。最新的linux内核引入了SO_REUSEPORT选项,该选项可以自动平衡监听同一端口的多进程,是内核级的解决方案。handy采用该方案,优于nginx的共享锁。

.测试中客户端本地端口不够:让服务器监听了200个端口,这样客户端连接服务器的每个端口只有50k个连接,然后加大默认的本地端口范围就可以满足要求(见前面的服务器系统参数)

测试中如果一次性创建千万个连接,则绝大部分的连接创建都会失败,因此让客户端每100ms创建2000个连接,提高连接创建的成功率。

系统在运行中,并没有多少的负载,当然啦,一部分负载跑到底层的hypervisor去了

小编实验的机器上内存占用大约40G,平均一个连接前后一共用了4k,不多不多

大家可以通过iptraf,nload等工具来查看系统的网络情况

写到这里,顺便给出我测是的ucloud主机的性能参数吧:
网卡流量最多可以到1.2GBit/s,并非所有时间都到了这么高,并不稳定,一般在800M-1.2G之间波动
tcp收包发包的最高qps是12w/s,多了就上不去了

单机千万并发连接实战(修订版)相关推荐

  1. 千万并发连接下,如何保障网络性能

    过去几十年互联网呈爆发式的增长,内容的丰富以及层出不穷的DDoS攻击等,对网络性能提出了极大的挑战,也同样促进了网络基础设施的快速发展.运营商的带宽越来越大,CPU/网卡等硬件的性能也会越来越强.但在 ...

  2. .NET5实战千万并发,性能碾压各版本,云原生时代,.NET5为王!

    在移动互联网时代掉队的.NET,当下正凭借着.NET5的开源跨平台以及容器友好,在云原生时代正在重铸辉煌.而作为.NET开发者,新年跳槽季的高并发问题会更多了,因为高并发能牵扯出太多问题,接口响应超时 ...

  3. 著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

  4. 到底一台服务器能够支持多少TCP并发连接?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 朱小厮 来源 | 公众号「朱小厮的博客」 曾几 ...

  5. 测试网络的带宽指令_单机千万级MQTT服务器测试报告

    目标:测试创建1000万客户端连接到Coolpy7 MQTT服务器端,服务器操作系统 Linux(任意一款发行版服务器版本).分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客 ...

  6. Java并发编程实战_福州java编程实战培训班排名

    如何选择福州java培训中心? 在福州,如果想迅速掌握java开发,参加福州java培训班无疑是一种非常有效的方式.但是,市场上有这么多的java培训机构,我们在选择的时候难免会眼花缭乱.福州java ...

  7. 100万并发连接服务器笔记之处理端口数量受限问题

    第二个遇到的问题:端口数量受限 一般来说,单独对外提供请求的服务不用考虑端口数量问题,监听某一个端口即可.但是向提供代理服务器,就不得不考虑端口数量受限问题了.当前的1M并发连接测试,也需要在客户端突 ...

  8. 100万并发连接服务器笔记之准备篇

    2019独角兽企业重金招聘Python工程师标准>>> 前言 测试一个非常简单服务器如何达到100万(1M=1024K连接)的并发连接,并且这些连接一旦连接上服务器,就不会断开,一直 ...

  9. 《C++并发编程实战》——1.1 什么是并发

    本节书摘来自异步社区出版社<C++并发编程实战>一书中的第1章,第1.1节,作者:[美] Anthony Williams (威廉姆斯),更多章节内容可以访问云栖社区"异步社区& ...

最新文章

  1. Python中requests包的安装
  2. 关于笔记本键盘错乱的原因及解决办法
  3. Python 常见语法逻辑错误收集
  4. php 对接 asp,PHP模拟asp中response类实现方法
  5. ubuntu12下subversion 1.6升级为1.8版本
  6. Java修炼之路——基础篇——数据类型
  7. Prometheus学习
  8. 信息学奥赛一本通(1406:单词替换)
  9. 被除数是负数的话,为啥要加上偏移量?
  10. linux多个文件打包命令行,linux命令五十七之tar命令;linux多个文件压缩打包到一个压缩文件...
  11. 杀死系统中的进程kill和killall命令
  12. Aix5~6小机运维
  13. 函数 fork 和函数 vfork区别
  14. OSGI.NET,请求因HTTP状态404 失败:Not Found
  15. 倾斜摄影三维模型五种常见格式
  16. python 数组去重的方法
  17. C# SolidWorks 二次开发 API ---创建异型孔特征
  18. 微信短信显示服务器解包异常,最新微信小程序解包反编译bug处理 解决 $gwx is not defined 错误...
  19. Python中zip函数的用法
  20. 谷歌插件开发(实现CSDN快速登陆)

热门文章

  1. hdu 4027 Can you answer these queries?
  2. 一个实用的JS自定义函数addLoadEvent()
  3. 在线XML美化格式化工具
  4. linux之sshpass命令
  5. VUE2.0增删改查附编辑添加model(弹框)组件共用
  6. [WM C++]从资源文件中加载显示png/jpg图片
  7. C#中机密文本的保存方案
  8. 2012年CIO最关心的十大安全问题
  9. 再学 GDI+[22]: TGPLinearGradientBrush - 之一: TLinearGradientMode
  10. birt插件 web_birt 集成到现有的web应用中