单机千万并发连接实战(修订版)

2023-05-16

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,多了就上不去了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单机千万并发连接实战(修订版) 的相关文章

  • Tesseract-OCR 字符识别---样本训练

    转自 xff1a http blog csdn net feihu521a article details 8433077 Tesseract是一个开源的OCR xff08 Optical Character Recognition xff
  • centos fluxbox 安装,个性化配置

    centos fluxbox 安装 个性化配置 张映 发表于 2010 12 01 分类目录 xff1a linux 我用的第一个linux系统是archlinux xff0c 当时装的桌面是fluxbox xff0c 界面简单 xff0c
  • 算数移位(<<, >>)与逻辑移位

    lt lt gt gt 是算数移位 xff0c 也就是 1 xff0c 如果右移 xff0c 则 最高位补1 左移 xff0c 则右边补0 但是uint32 t的10 00 00 00 右边移动后 xff0c 是什么 xff1f 补0呗 x
  • OCR数据集

    1 SynthText in the Wild dataset 数据集下载链接 xff1a http www robots ox ac uk vgg data scenetext 数据集介绍 xff1a 一个综合生成的数据集 xff0c 其
  • Linux(centos)下搭建confluence

    1 下载文件 2 将下载的文件放到 opt路径下 通过上图可以看出confluence安装到了 opt atlassian confluence和 var atlassian application data confluence目录下 x
  • gitlab中文社区

    1 获取gitlab中文社区项目 中文社区版项目 xff1a https gitlab com xhang gitlab 2 克隆中文仓库 git clone https gitlab com xhang gitlab git 3 查看gi
  • 阿里云 oss python3 例子

    阿里云的oss SDK又是不支持python3 xff0c 头疼头疼 本想改一改它的SDK xff0c 让它支持python2 43 python3 xff0c 无奈里面大量的代码使用不带括号的print xff0c 工作量恐怖 幸好oss
  • 【C语言课程设计】利用结构体数组实现文件内容的增删改查

    啦啦啦 xff0c 又到了学习时间 xff0c 现在给大家介绍结构体数关于文件内容的增删改查 我们先把相关代码写好 xff0c 再使用EGE xff0c 慢慢来不着急 一 文件的打开方式 假设文件名叫list txt 首先我们要建立一个文件
  • Mysql中limit的用法详解

    在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql已经为我们提供了这样一个功能 SELECT FROM table LIMIT offset
  • 在Windows10上安装CodeSoft 2015,系统蓝屏,解决办法

    最近公司电脑更新换代 xff0c 替换成Windows 10系统 xff0c 在安装CodeSoft 2015 标签软件时 xff0c 电脑蓝屏重启 xff0c 软件安装失败 xff0c 且无法卸载 xff0c 之后只能重装系统 在经过系统
  • Win10 WSL下 Ubuntu20.04 安装与卸载 Mysql 8.0

    一 查询并卸载旧的mysql xff08 未安装可以直接跳过 xff09 查看MySQL的依赖项 dpkg list grep mysql 关闭mysql服务 service mysql stop 自动卸载mysql xff08 包括ser
  • ios性能优化实践

    本文将从原理出发 xff0c 解释卡顿发生的原理 xff0c 然后会讲解项目中行之有效的几个优化点 xff0c 最后会展望一下接下来将要尝试的方向 下面进入正题 屏幕显示的原理 基本原理 屏幕显示原理 我们知道 xff0c 远古时代的CRT
  • MATLAB平面几何图形绘制实例

    MATLAB 平面几何图形绘制实例 实例一 运动控制测试图形 以下图形用于运动综合测试 xff0c 平面图形包含直线 圆弧 整圆 锐拐角 钝拐角 xff0c 能比较充分的测试各种轨迹 运动控制性能 输入圆心和半径可以调整图形大小和偏移 xf
  • Liunx系统ifconfig无法显示ip地址

    1 针对于Liunx的CentOS8 5系统 2 查看NetworkManager网络状态 nmcli n enabled设置下次开机时 xff0c 后面接的 unit 会被启动 开启NetworkManager网络 nmcli n on
  • CentOS8安装MySQL8.0版本遇到的问题

    41 错误1 xff1a libncurses so 5 64bit is needed by MySQL client 5 6 47 1 el6 x86 64以及 libtinfo so 5 64bit is needed by MySQ
  • LiunxCentOS8系统配置yum源

    更新yum源的原因如下 xff1a 因为LiunxCentOS8系统里面停止维护了 xff0c 导致yum无法使用必须自己配置一个yum源 如使用CentOS8系统自带的yum源进行下载安装则会出现以下错误 xff1a 错误 xff1a F
  • redis主从复制

    什么是redis主从复制 redis主从复制是指在redis集群中master节点和slave节点数据同步的机制 将写入redis服务器的数据复制到其他redis服务器里面实现数据同步 master节点负责写操作 xff0c slave节点
  • 单机千万并发连接实战

    c10k xff0c c100k xff0c c1000k等问题大家都已经司空见惯 xff0c 那么10m xff08 千万 xff09 并发连接呢 xff1f 今天就来一起挑战一下吧 准备机器 10m连接 xff0c 大家的个人电脑肯定无
  • mysql数据库dblink的使用

    1 使用mysql数据库里面的FEDERATED引擎 xff0c 这个必须要开启 show engines 我这里是开启了FEDERATED引擎 2 开启FEDERATED引擎 sed i 39 afederated 39 etc my c
  • CentOS8系统安装MySQL过程中遇到的错误问题

    1 启动过程中出现类似于 单元启动失败 错误 解决 xff1a 把之前初始化成功的文件删除掉 var lib mysql 这个文件 注 xff1a 如不想删除则可以备份起来 这是初始化之后生成的文件 1 再次初始化生成文件 mysqld i

随机推荐

  • Liunx系统CentOS Linux release 8.5.2111安装percona-toolkit

    官网 xff1a https www percona com downloads percona toolkit LATEST 依赖 xff1a yum install perl DBI perl DBD MySQL perl Time H
  • MySQL物理备份工具-xtrabackup

    依赖包 xff1a wget O etc yum repos d epel repo http mirrors aliyun com repo epel 7 repo yum y install perl perl devel libaio
  • 传输线与特性阻抗

    一 什么是传输线 我们经常会用到传输线这一术语 xff0c 可是讲到其具体定义时 xff0c 很多工程师都是欲言又止 xff0c 似懂非懂 我们知道 xff0c 传输线用于将信号从一端传输到另一端 xff0c 下图说明了所有传输线的一般特征
  • 51单片机中断号与定时器的工作方式

    中 断 号 interrupt 0 外部中断0 xff08 EX0 xff09 interrupt 1 定时器 计时器器中断0 xff08 ET0 xff09 interrupt 2 外部中断1 xff08 EX1 xff09 interr
  • delay函数

    在VC中使用带上头文件 include lt windows h gt 注意 在VC中Sleep中的第一个英文字符为大写的 34 S 34 在标准C中是sleep 不要大写 下面使用大写的来说明 具体用什么看你用什么编译器 简单的说VC用S
  • 51单片机的中断和定时(全面)

    定时器 计数器 51的定时器 计数器有2个分别是T1和T0 52系列的单片机有3个定时器 计数器 xff0c T0和T1是通用定时器 计数器 xff0c 定时器 计数器2 xff08 简称T2 xff09 是集定时 计数和捕获三种功能于一体
  • 什么是信号完整性?(大白话)

    什么是 信号完整性 xff1f 可能很多人仍然感觉这个词很陌生 xff0c 尤其是哪些没有接触过所谓高速PCB的工程师来说更是如此 于博士网就给大家做一个直观的说明 我们在用示波器测量PCB板上信号时 xff0c 经常会在信号的波形上发现一
  • 什么是高速PCB?

    高速PCB是一个很流行的名词 xff0c 那么到底什么是高速PCB xff1f 可能没几个人能说清楚 xff0c 原因在哪 xff1f 于博士网阐述一下我们对高速PCB这一名词的见解 有一种观点认为 xff1a 数字电路的速率达到或者超过4
  • epoll LT/ET 深入剖析

    epoll LT ET 深入剖析 EPOLL事件有两种模型 xff1a Level Triggered LT 水平触发 socket接收缓冲区不为空 有数据可读 读事件一直触发 socket发送缓冲区不满 可以继续写入数据 写事件一直触发
  • PCB布局布线1

    1 1mil 61 0 001inch 61 0 0254mm oz质量单位 xff0c 指铜厚 2 层叠结构 1 走线长度 宽度 厚度影响寄生电容电感 2 电源层和地层都比较厚 xff1a a 屏蔽辐射干扰 串扰b 减小阻抗3 3 走线电
  • 大功率连接器(电源和信号)

    EXtreme Power连接器 xff08 7 5mm xff09
  • Altium Designer高级布线技巧

    1 模块化复用 选择两个或多个元件 右击 union 联合 创建联合 选择模块 M O键 输入角度 点击模块 2 同一模块在不同工程中布局布线复用
  • 02.算术左移逻辑左移,算术右移逻辑右移

    xfeff xfeff 1 算术左移逻辑左移 算 术左移和逻辑左移一样都是右边补0 xff1a 比如 00101011 算术左移一位 01010110 逻辑左移一位 01010110 对于二进制的数值来说左移n位等于原来的数值乘以2的n次方
  • Bellman-Ford(单源最短路径,判断是否有负权环路)

    Bellman Ford 1 初始化 xff1a 将除源点外的所有顶点的最短距离估计值 d v 43 d s 0 2 迭代求解 xff1a 反复对边集E中的每条边进行松弛操作 xff0c 使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其
  • C语言第一个程序(超详细)

    include lt stdio h gt 包含一个叫stdio h的文件 std 标准 standard input output int main int 是整型的意思 main前面的int表示main函数调用返回一个整型值 inclu
  • warning:initialization discards ‘const’ qualifier from pointer target type 解决方法

    initialization discards const qualifier from pointer target type 意思是 xff0c 初始化时丢掉了 xff08 目标类型的 xff09 const 限定符 eg const
  • [C/C++]写出几个无限循环

    1 写出几个死循环 while 1 注 xff1a 1不可省略 for 注 xff1a 第一个条件为初始条件 xff0c 第二个条件是循环结束条件 xff0c 第三个表达式是变更表达式 循环结束条件若是省略的话 xff0c 应写入循环体中
  • 数据结构之队列

    一 链式队列 数据结构 xff1a 两个指向节点的指针front rear 当链队为空时 xff0c front和rear都指向头节点 因此出队时 xff0c 删除队尾节点时要注意 xff01 link queue h 1 typedef
  • 二叉树

    1 二叉树节点的创建 xff08 初始化 xff09 tree c include lt stdlib h gt include 34 tree h 34 struct tree node tree node create data t d
  • 单机千万并发连接实战(修订版)

    c10k xff0c c100k xff0c c1000k等问题大家都已经司空见惯 xff0c 那么10m xff08 千万 xff09 并发连接呢 xff1f 今天就来一起挑战一下 下面我们使用handy库自带的例子程序 xff0c 来跑