linux服务器高并发的极限和瓶颈

2023-10-28

最大并发数探究

Fancylee 2022.03.30

并发数&QPS

并发数;系统中同时存在的请求(同时处理中)
QPS: query per second 每秒的访问数

如何理解?
将整个系统比喻成一个超市,QPS在超市门口测得的每秒钟有多少人进来,并发数就是超市能同时承载多少人。假设每秒钟有10人进来,每个人逛超市10s,那么超市中至少有多少人在逛?
并发数 = QPS * AVG
100人同时在逛超市

ab测试中
比如我给定期望值并发数1000,发送100w个请求,测试结束得到测试时长75s,
则理论上QPS=100W/75=13333,AVG=0.075s(平均每个请求处理时间)

但是实际的测试结果中,AVG并不是100W/75,在系统空闲下AVG会低于预期值(系统在处理中不但把请求处理完成,还留有空闲),而系统拥堵下AVG会高于预期值
如果AVG低于预期,则增大预期并发值,直到AVG超过可接受的容忍时间,再通过
并发数 = QPS * AVG算得实际最大并发

wrk测试中
给定保持的连接数(并发数),压测时间,和使用线程数(一般为使用系统核心的偶数倍,主要是为了 WRK 能最大化利用 CPU,调节成测试机器核心数即可)
最终得到的是 AVG 和QPS
不断调节并发数,直到QPS达到最大值,计算出实际最大并发

如何模拟并发

一台机器开多线程利用不同的port(socket客户端不指定port)发送请求,这样可以尽可能模拟并发效果。

带宽影响并发数

1Mb/s =128KB/s 减免12%的消息标头等 ,1Mb/s = 112KB/s:

在传输过程中的并发数计算 并发数=带宽(KB/S)/请求大小(KB)
时间含义是该带宽下,每秒最大发送到服务的请求数量

服务器能承载多少并发?

句柄

主流的服务器模式,是由单端口去建立监听套接字,通过线程或者进程去accept得到连接套接字,每一个连接套接字,占用进程空间中一个句柄(文件描述符),所以句柄数决定了服务端最多可以同时存在多少连接(处理多少请求)

/proc/sys/file_max

下 默认值为379400,这个值是由系统根据服务器性能自行计算的,可以修改

从用户层面来说使用ulimit -a 来查看该用户可以使用多少个句柄
从系统层面在proc/sys/file_max 查看最大的句柄数

线程

32位系统,
single processer 单进程下进程空间为4g(虚拟),其中用户使用3g,
stack size 线程栈空间 8m(ulimit -a查看),也就是单进程下最多开375个线程

64位系统,
用户进程空间128T,约可创建1000多w的线程,可以认为在内存足够大的情况下,线程数没有限制
但系统也提供了限制参数

/proc/sys/kernel/threads-max
				 pid-max 最大进程数
				 max-map-count 单个进程可用Vma(虚拟内存块)的数量,影响进程可用空间

线程的利用效率主要和所用的服务器范式有关,对线程的利用率越高,可承载并发越大
1.单进程
3.多进程 (frok策略)
3.单进程多线程(epoll模型+协程?)
4.多进程多线程 (frok+epoll)

目前服务器多采用3、4

硬件
cat /proc/cupinfo
grep 'processor' /proc/cpuinfo | sort -u | wc -l #查看单cpu线程数

cup的核心数和线程数决定了真并发效率

服务器使用Intel® Xeon® Gold 61xx CPU,8cup*8cores=64threads(服务器性能足够,没有使用intel的超线程技术即单核双线程)

假设一个线程处理的时间为100ms,cup可以同时跑64个线程,qps=64/0.1 qps=640

取我们某天的数据

峰值并发调用量:1.21亿/天 ,803万/小时,13.8万/分(2022.3.19)

秒级高峰并发在0.23w/s,横向部署8台机器12.8w/s(cpu理论值),仅从cup角度分析是可以cover住。

小结

​ 综上,从服务器端可以认为并发大小的实际决定因素是线程数量和句柄数量;
​ 考虑如何开启更多线程,或者在有限的线程下提高线程使用效率;提高句柄数量,防止句柄数的限制使得承载能力成为瓶颈;检测网络带宽是否充裕,带宽利用率一般不超过70%为好;

​ 实际上,长连接tcp并发数主要反映了承载量;短连接tcp并发数,主要看平均响应时间。
​ 本文未考虑的因素,比如 平均响应时间,这个也对并发影响比较大,主要来源cup的计算,文件io,数据库io等,本文没有谈论其影响,只是从句柄和线程的数字上去讨论了并发承载能力,可用理解为长连接下的并发承载量。

​ 另外,抛出一个问题,只考虑单机服务器下可以承载的tcp同时连接的数量,我认为的答案
​ 连接数量是没有上限的,取决于你的机器性能,如果有上限那就是ipv4的最大承载和可用port的乘积。

参考:带宽与并发https://zhuanlan.zhihu.com/p/339624863
并发指标http://www.mobabel.net/%E6%80%BB%E7%BB%93%E6%B5%81%E9%87%8F%EF%BC%8C%E5%B8%A6%E5%AE%BD%EF%BC%8C%E7%AB%AF%E5%8F%A3%E8%AE%A1%E7%AE%97/

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

linux服务器高并发的极限和瓶颈 的相关文章

随机推荐

  • 记录一次网站漏洞修复过程(一):安全报告

    XXXXX网站安全测试报告 1 测试目标和对象 1 1 测试目标 渗透测试利用网络安全扫描器 专用安全测试工具和富有经验的安全工程师的测试经验 通过网络对系统进行非破坏性质的模拟黑客攻击 目的是深入挖掘漏洞风险 侵入系统并获取敏感信息 并将
  • 算法 分金币

    圆桌旁坐着n个人 每人有一定数量的金币 金币总数总能被n整除 每个人可以给他左右相邻的人一些金币 最终使得每个人的金币数相等 你的任务是求出被转手的金币数量的最小值 输入第一行为整数n n lt 1000000 以下n行每行为一个整数 按逆
  • [已解决] 通配符的匹配很全面,但无法找到元素 'aop:aspectj-autoproxy' 的声明。

    问题背景 今天在基于注解配置AOP的时候 出现了以下错误 Caused by org xml sax SAXParseException lineNumber 37 columnNumber 25 cvc complex type 2 4
  • SpringBoot 学习摘要

    SpringBoot 今日目标 掌握基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot的完成SSM整合项目开发 1 SpringBoot简介 SpringBoot 是由
  • Keil开发环境安装教程

    一 环境安装包 百度网盘链接 https pan baidu com s 1MVlP7yWM mDu Rf xFPFQ 二 安装步骤 1 双击安装mdk515 exe 默认即可 可更改路径 2 安装完成后 用管理员的身份运行keil 3 在
  • JavaScript设置innerHTML时出现“未知的运行时错误”--我也遇上了

    在Ajax里经常会通过innerHTML来改变界面 这个比使用DOM要简单一些 比如 element innerHTML something 不过 在IE中 有时候会出现 未知的运行时错误 unknown runtime error 而在f
  • C语言在读取txt类型文件中的汉字字符串出现乱码的解决办法

    题目 C语言在读取txt类型文件中的汉字字符串出现乱码的解决办法 以下是本篇文章正文内容 欢迎朋友们进行指正 一起探讨 共同进步 来自考研路上的lwj 一 前言 当我们在练习文件这一章节时 因为需要从文件中读取数据 有很多数据是中文形式的
  • 【 Spring Boot + MyBatis Plus + Druid】

    1 1 配置版本 具体使用到的各配置版本信息如下 JAVA17 SpringBoot 3 0 5 MyBatis Plus 3 5 3 1 Druid 1 1 14 MySql 5 0 8 因为以前装的老版本的mysql 用的mysql c
  • K210、Openmv与串行总线舵机通信(基于micropython)舵机驱动板和舵机控制板代码

    最近博主在使用幻尔公司 串行总线舵机时 想使用k210控制 openmv和k210都是micropython编写的所以这个代码是通用的 由于官方没有相关例程 树莓派的版本是python版本代码 用不了 特此分享一下控制代码 主要调用函数 a
  • Spring的应用上下文

    Spring提供了多个应用上下文 以下三个必须掌握 因为最容易遇到 1 ClassPathXmlApplicationContext 从classpath处获取xml文件来加载一个上下文 2 ClassPathXmlApplicationC
  • Java学生管理系统(简单版)

    步骤 A 定义学生类 B 学生管理系统的主界面的代码编写 C 学生管理系统的查看所有学生的代码编写 D 学生管理系统的添加学生的代码编写 E 学生管理系统的删除学生的代码编写 F 学生管理系统的修改学生的代码编写 A 定义学生类 Stude
  • HTML表格标签

    标签 与 标签的关系 是互相包裹的关系 或者说 里外嵌套的关系 快捷写法 p gt img 表格 由 table 标签来定义 每个表格均有若干行 由 tr 标签定义 每行被分割为若干单元格 由 td 标签定义 字母 td 指表格数据 tab
  • PHP实现AES-128-CBC加密+base64_encode

    AES加密 public function encrypt input 传false相当于base64 encode 编码了一次 encode base64 encode openssl encrypt input AES 128 CBC
  • SSH反向代理使用

    SSH反向代理 先说说什么是代理 源服务器由于各种原因无法访问目标服务器提供的服务 但是存在一个agent服务器 源服务器可以访问它 它可以访问目标服务器 那么源服务器的消息发给他 它在把请求转发给目标服务器 就间接的实现了源服务器访问目标
  • 进程(process)、线程(thread)、协程 (Coroutine) 的区别

    说到协程 Coroutine 我们必须提到两个名称相似的东西 在操作系统 os 级别 有进程 process 和线程 thread 两个 仅从我们常见的讲 实际的 东西 不说概念是因为这两个家伙的确不仅仅是概念 而是实际存在的 os的代码管
  • Short与Integer互转

    int 是4字节 short 是2字节的 如果将int Integer 转成short Short 那么必须强制转换 否则会报编译异常 但是 当int Integer 是一个final时 可以直接转换 不必强转 如 short t 1 正确
  • 【力扣1462】课程表(拓扑排序+bitset优化到O(n))

    题目描述 你总共需要上 numCourses 门课 课程编号依次为 0 到 numCourses 1 你会得到一个数组 prerequisite 其中 prerequisites i ai bi 表示如果你想选 bi 课程 你 必须 先选
  • android虚拟机启动不了,android虚拟机adb不能启动情况汇总

    在开启android虚拟机的时候 可能会遇到adb不能启动的问题 大概有以下几下情况 1 报错 BUILD FAILED D workspace ganji build xml 144 The following error occurre
  • 底量超顶量超级大黑马指标源码_底量超顶量超级大黑马指标源码

    主力买力度 LARGEINTRDVOL 100 VOL COLORRED 主力卖力度 LARGEOUTTRDVOL 100 VOL COLORGREEN 超B L2 VOL 0 0 VOL CAPITAL 大B L2 VOL 1 0 VOL
  • linux服务器高并发的极限和瓶颈

    最大并发数探究 Fancylee 2022 03 30 并发数 QPS 并发数 系统中同时存在的请求 同时处理中 QPS query per second 每秒的访问数 如何理解 将整个系统比喻成一个超市 QPS在超市门口测得的每秒钟有多少