目录
单台服务器:最大并发/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个人里到底怎么筛选出谁能抢到票的呢?
本文探讨了单台服务器的最大并发能力,从端口角度分析,理论上的最大并发数可达65535的倍数,但实际上受到内存和CPU资源限制。每个TCP连接消耗内存和文件句柄,最大并发量与系统内存和CPU核心数相关。同时,服务器的最大线程数取决于CPU处理能力和内存大小,线程数量的计算公式为可用内存除以每个线程的堆栈大小。在并发选择上,当请求大于处理线程时,服务器需要策略性地分配资源。
9453





