最大并发数探究
Fancylee 2022.03.30
并发数
(同时发请求的用户数,一般以1s为单位),但实际到达服务器会依照网络环境发生变化,比如以100并发请求服务器,实际同时到达服务器的请求会低于100。
如何模拟并发
一台机器开多线程利用不同的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个线程
6位系统, 用户进程空间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的超线程技术即单核双线程)
假设一个线程处理的时间为40ms,秒级并发1000/40*64=16000 1.6w
取我们某天的数据
峰值并发调用量: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/
|