jmeter Tomcat最大线程数超过300后未增加,CPU未充分用于高负载

kse8i1jr  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(213)

我有一个使用嵌入式NIO tomcat的spring Boot 2.7.0的微服务。该应用程序负责接收请求,并对每个请求进行6个并行远程调用,最多等待2秒,以获得6个请求中任何一个的响应。
在使用jmeter测试这个微服务的性能时,我观察到CPU的利用率仍然不足14-15%,但是微服务的响应时间增加到了一分钟以上,通常不应该超过2-3秒。
我的微服务中有3个线程配置:
1.我尝试了maxthreads,maxconnection,accept-like(5000,30000,2000),(500,10000,2000),(200,5000,2000)的各种配置,但是CPU总是没有得到充分的利用。

server.tomcat.max-threads=200
server.tomcat.max-connections=5000
server.tomcat.accept-count=2000
server.connection-timeout=3000

1.对于接收到的每个请求,我们创建一个并行度为6的ForkJoinPool来进行6个远程调用。newWorkStealingPool。还将池大小增加到与tomcat的maxThreads相同或更高,但结果是相同的CPU仍然未充分利用,但微服务需要一分钟以上的时间来响应。在这里记录活动线程计数时,我们发现无论我们将线程池大小或tomcat maxthreads增加多少,活动线程计数都会上升到300,然后开始下降。我们尝试使用4核8 GB系统和8核16 GB系统,结果完全相同
1.为了进行远程调用,我们使用spring rest模板,其中maxConnTotal和maxConnTotalPerRoute与tomcat的maxthreads相同。maxConnTotal和maxConnTotalPerRoute相同,因为所有6个远程调用都指向同一个服务器。
下面是使用的jmeter参数-GTHREADS=1000 -GRAMP_UP=180 -GDURATION=300这个微服务有3个示例正在运行,大约在jmeter启动2-2.5分钟后,所有3个示例的所有请求的响应时间都超过了一分钟,而CPU仅保持在14-15%。如果CPU将达到35%,请有人帮助确定哪些CPU没有达到峰值则自动扩展将启动,但由于CPU未充分利用,因此不会发生扩展

yhived7q

yhived7q1#

1.使用VisualVMYourKitJProfiler之类的分析器工具查看应用程序在何处花费的时间最多

  1. CPU并不是唯一可能的瓶颈,检查Tomcat的连接池利用率,因为请求排队、内存使用、网络使用、database pool usageDB slow queries log等都可能是这种情况。
dauxcl2d

dauxcl2d2#

我们用WebClient替换了用于远程调用的RestTemplate,并引入了WebFlux Mono,使整个请求不阻塞。现在,请求本身返回我们的响应,用Mono Package 。它解决了我们的问题,现在没有空闲时间,因为线程在IO上没有阻塞,而是忙碌服务其他请求。

相关问题