Spring Boot 线程池指标

标签 spring spring-boot

我们有一个 Spring Boot 应用程序,随着负载的增加,它变得无响应。我们检查了 CPU、RAM 和数据库连接,看不到它们有任何峰值。 但是,大约有 200 个线程具有相同的 Stack Trace:

-Spring @Service invoked here
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

我认为这可能是某些线程池中的瓶颈。我应该检查哪些指标? tomcat线程池大小?有什么更具体的 mvc 吗? 非常感谢

最佳答案

开始时一个好的指标可能是 JVM 中的当前线程数。
您可以使用:

//only own Threadgroup
Thread.activeCount();
// all Threads, using JMX API
ManagementFactory.getThreadMXBean().getThreadCount();

或者您可以使用外部工具,例如 Java VisualVM

我建议使用线程转储来解决这个问题。您可以每 10 秒左右创建一次线程转储并存储它们直到错误发生。 如果您对此有存储问题,请删除旧的转储,因为我们只对事件周围的转储感兴趣。

随后,您可以使用 JProfiler 分析转储

我还找到了this有关线程转储分析和 this 的文章有关线程计数的文章非常有帮助。

关于Spring Boot 线程池指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71509187/

相关文章:

java - Flex 错误 flex.messaging.io.amf.ASObject 无法转换为

来自复杂 XML 的 Java 对象,仅对子元素感兴趣

java - 使用 Jackson 自定义反序列化器通过 RestTemplate 解析 Spring-Boot 2.1.0 页面响应

Spring REST Controller 不处理 gzip 压缩输入

java - Heroku 无法检测到构建包 - Spring Boot

spring-boot - 如何使用 Intellij 版本 2022.3 将 Maven 设置为 Spring Initializr 的默认类型

spring - 如何在Spring boot中使用注释来使用参数解析器?

spring - 初学者 Spring : how to handle urls

java - Spring Boot 应用程序不使用 java -jar 运行

java - aws.accessKeyId 和 aws.secretKey 未被读取