基础环境
Linux操作系统,128G内存,40核心数CPU
测试代码
@RequestMapping(value = "/test/tomcat", method = RequestMethod.GET)
@ResponseBody
public void testTomcat() {
int j = 0;
for (int i = 0; i < 2000; i++) {
j = j + i;
}
}
tomcat配置
tomcat默认配置
测试
测试1:
开启线程数 | 开启连接数 | 测试数量[W] | QPS[S] | CPU使用率[%] |
---|---|---|---|---|
1 | 1 | 10 | 3800 | 100 |
CPU使用率:
JVM线程情况:
从JVM线程情况中,我们可以发现,Tomcat默认启动10个线程。由于客户端只开启了一个线程,途中绿色部分标识线程的运行状态。我们从中可以发现,绿色部分在10个线程中是交替出现的。
测试2:
开启线程数 | 开启连接数 | 测试数量[W] | QPS[S] | CPU使用率[%] |
---|---|---|---|---|
2 | 2 | 80 | 6662 | 210 |
CPU使用率:
JVM线程情况:
从JVM的线程状态中,我们发现同一时刻有2个线程处于运行状态。因为我们开启了两个客户端连接请求
测试3:
开启线程数 | 开启连接数 | 测试数量[W] | QPS[S] | CPU使用率[%] |
---|---|---|---|---|
4 | 4 | 160 | 22862 | 394 |
CPU使用率:
JVM线程情况:
从JVM的线程状态中,我们发现同一时刻有4个线程处于运行状态
测试4:
开启线程数 | 开启连接数 | 测试数量[W] | QPS[S] | CPU使用率[%] |
---|---|---|---|---|
8 | 8 | 320 | 42122 | 744 |
CPU使用率:
JVM线程情况:
从JVM的线程状态中,我们发现同一时刻有8个线程处于运行状态
测试5:
开启线程数 | 开启连接数 | 测试数量[W] | QPS[S] | CPU使用率[%] |
---|---|---|---|---|
16 | 16 | 640 | 69684 | 1445 |
CPU使用率:
JVM线程情况:
从JVM的线程状态中,我们发现同一时刻有16个线程处于运行状态
测试6:
开启线程数 | 开启连接数 | 测试数量[W] | QPS[S] | CPU使用率[%] |
---|---|---|---|---|
32 | 32 | 1280 | 88159 | 1714 |
CPU使用率:
JVM线程情况:
当线程数开到了32个的时候,我们发现JVM中有大量线程处于空闲时间,CPU没有用满。
经过研究发现,Tomcat内部使用的阻塞队列的性能瓶颈所致
总结
tomcat的性能随着线程数的增加而增加,当QPS达到10w左右的时候,其内部的处理队列性能存在瓶颈,在压测,QPS已经上不去了。所以我们在开发的时候,基本上不用担心Tomcat的性能问题。在硬件资源充足的情况下,tomcat基本上满足服务。如果一个不够,就在来一个