单台服务器:最大并发,最大线程,并发选择

本文探讨了单台服务器的最大并发能力,从端口角度分析,理论上的最大并发数可达65535的倍数,但实际上受到内存和CPU资源限制。每个TCP连接消耗内存和文件句柄,最大并发量与系统内存和CPU核心数相关。同时,服务器的最大线程数取决于CPU处理能力和内存大小,线程数量的计算公式为可用内存除以每个线程的堆栈大小。在并发选择上,当请求大于处理线程时,服务器需要策略性地分配资源。

目录

单台服务器:最大并发/TCP连接数

端口角度:

资源角度: 内存 + CPU 

查看设置最大并发:

单台服务器:最大线程

CPU相关:

内存相关:

并发选择


单台服务器:最大并发/TCP连接数

参考:http://www.sohu.com/a/289028571_371153

端口角度:

  • 有的朋友可能会说是65535,因为操作系统有65535个端口,那么这个答案准确吗?凭什么认为一个端口同一时刻只能接收一个请求?

       逆向思考:若同一时刻只能接收一条请求,那你的项目端口肯定是固定值,那就不会有并发现象,但实际呢?

       正向验证:在Tomcat服务器10.0.0.3上使用8080端口,用5个并发来进行压测,是完全可以的;

       结论:所以从端口角度,最大并发数=65535*n,理论上可以无限大;但实际中怎么可能无限大,都得受制于资源;

资源角度: 内存 + CPU 

每一个TCP链接至少得有这4个要素:{本地ip,本地port,远程ip,远程port};

在Linux系统中,一切皆文件,每一个TCP链接都要占用一个文件句柄;系统允许创建的链接数取决于句柄数的上限;

而每创建一个链接需要消耗一定的内存,大概是4-10kb,所以链接数也受限于机器的总内存。

这样的话:1G【内存】抗 10万【链接】,一般服务器内存得128G左右,能抗千万级的并发,但实际不能把内存都用来抗并发数,所以知道个大概就行;

当然,内存抗住了但cpu掉链子处理不了10万的链接也白搭;所以最大并发也受限于CPU;

查看设置最大并发:

  • 通过命令ulimit -n可以查看当前系统允许打开文件数量的上限,在Linux中这个值默认是1024,也就是说默认情况下,只能创建1024个链接。
  • 同时这个值也是可以修改的,通过修改/etc/security/limits.conf文件,可以把这个值改大,一般服务器都会改的很大,比如我们的服务器上一般设置为1000000。
  • 超过这个值再创建链接就会报这样的错误:“Can't open so many files"

单台服务器:最大线程

参考:https://www.cnblogs.com/amberJava/p/13261279.html

首先明确:一个线程同一时刻只能处理一个请求request;

那么:千万级别的并发进到服务器了,但你的线程够接待处理这些并发吗?

所以:单台服务器的最大线程是多少?

CPU相关:

线程是用来【处理】的,“处理”肯定得跟中央处理器CPU有关,CPU又是多核的;线程数量还与操作系统的一些内核配置有很大的关系;

注:下图红框中有几个小窗口,CPU就是有几个核

内存相关:

CPU处理请求必然会占用内存,每个线程都有一个线程栈空间;所以受限于内存;

关于jvm内存的配置:

-Xms4096m

-Xmx4096m

-XX:MaxPermSize=1024m

-Xss1M:   设置每个线程的堆栈大小.JDK5.0以后每个线程堆栈大小为1M

用如下命令打印,linux服务器 虚拟机栈大小

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

实际上,计算线程数,有个通用公式

线程数量 = (MaxProcessMemory - JVM堆内存 - ReservedOsMemory) / ThreadStackSize(XSS)

MaxProcessMemory:最大地址空间;

ReservedOsMemory:系统保留内存,一般在136M左右;

ThreadStackSize:每个线程的堆栈大小;

简单说:线程数 = 可用内存 / 每个线程占用的内存

若进行比喻:服务器就是一个饭店,端口就是饭店的门,门够宽够大能让n顾客同时进来;并发数1000万就是同一时刻进来1000万个顾客,线程数1000个就是只有1000个服务员来接待顾客,那没服务员接待的怎么办?要么根本就不让接待不了的顾客进来,要么进来了等着,等接待完别人了再接待他们;

并发选择

Q1:  若单台服务器接收到1000并发请求,但只有100个处理线程;

若这1000人的请求【先后】到达服务器,那好说,按先后顺序给其分配线程,谁快给谁;

若这1000人的请求【同时】到达服务器,那这100个线程怎么分配?

这个有绝对的公平吗?即你跟其他999个人的request请求同时到达服务器,但你就是没抢到火车票,是不是挺郁闷的?所以这1000个人里到底怎么筛选出谁能抢到票的呢?

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值