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

最大并发数探究

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/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值