我们有一个 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 分析转储
关于Spring Boot 线程池指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71509187/