不同性能,不同机器,不同线程池参数 压力测试对比实验
硬件配置对比
特性 | Macbook Air M1 | 虚拟机Ubuntu |
---|---|---|
CPU | 8核 (4性能核 + 4能效核) | Intel Core i5-12400, 6核心 |
内存 | 8GB | 6GB |
环境 | Docker容器 | Docker容器 |
一、比较Mac和虚拟机中相同类型请求的并发能力
6核心6GB
并发100
Ubuntu
M1
并发1000
Ubuntu
M1
并发5000
Ubuntu
M1
并发1w
Ubuntu
M1
二:同一虚拟机不同性能对比
4核心4GB
并发100
并发1000
并发5000
并发10000
4核心6GB
并发100
并发1000
并发5000
并发10000
三、不同Tomcat最大线程间的对比
SpringBoot版本2,3.12 Tomcat默认连接数是8192 默认核心线程数200(M1)
线程数200
线程数500
线程数1000
知识点记录
在配置Tomcat内置的线程池时,可以设置多个参数来优化服务器的性能和响应能力。这些参数通常在application.properties
或application.yml
文件中配置,或者直接在Tomcat的server.xml
配置文件中设置。这些参数影响Tomcat线程池的行为方式,与Java标准线程池(如ThreadPoolExecutor
)中的参数类似,但有一些特定的差异。
Tomcat线程池的关键参数
1. maxThreads
(最大线程数)
-
Tomcat: 此参数设置可用于处理请求的最大线程数。超出此数量的请求将被放在等待队列中。
-
Java: 类似于
ThreadPoolExecutor
中的maximumPoolSize
,这是池中允许的最大线程数。
2. minSpareThreads
(最小空闲线程数)
-
Tomcat: 定义了池中应保持空闲的最小线程数。Tomcat会确保即使在低负载时也有这么多线程处于活跃状态,以快速响应新的请求。
-
Java: 对应于
ThreadPoolExecutor
中的corePoolSize
,即即使空闲也始终保持在池中的线程数。
3. maxIdleTime
(最大空闲时间)
-
Tomcat: 线程空闲超过此时间后,将被回收。这可以防止在负载较低时资源浪费。
-
Java: 在
ThreadPoolExecutor
中,这类似于keepAliveTime
,如果池中的线程数超过corePoolSize
,这些超出部分的线程在空闲指定时间后会被终止。
4. maxQueueSize
(最大队列大小)
-
Tomcat: 设置等待队列的最大长度,超出这个长度的请求可能会被服务器拒绝或超时。
-
Java: 在
ThreadPoolExecutor
中对应的是BlockingQueue
的容量,例如LinkedBlockingQueue
或ArrayBlockingQueue
。
5. acceptCount
-
Tomcat: 当所有可以使用的处理请求的线程都被使用时,这个参数定义了可以放在连接请求队列中的最大连接数。
-
Java: 没有直接对应,但可以视为是处理任务前的另一层队列的大小限制。
6. connectionTimeout
-
Tomcat: 这是服务器等待客户端发送请求数据的超时时间。如果在此时间内没有数据被接收,连接将被关闭。
-
Java: 这更类似于网络编程中的超时设置,而非线程池的直接配置。
示例:Tomcat配置与Java线程池的对应关系
Tomcat:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="200" minSpareThreads="10" acceptCount="100" />
Java线程池:
int corePoolSize = 10; // minSpareThreads int maximumPoolSize = 200; // maxThreads long keepAliveTime = 60000; // maxIdleTime BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100); // maxQueueSize ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, workQueue );
通过对比这两种配置,可以看到Tomcat线程池和Java线程池配置在概念上是相似的,但Tomcat的配置还包括了针对网络连接特有的参数。这些设置帮助优化Tomcat作为Web服务器处理HTTP请求的能力,而Java线程池的配置则更为通用,适用于多种并发任务处理场景。