【问题标题】:SpringBoot Application : CPU usage reaches to maximum just sometimesSpring Boot 应用程序:CPU 使用率有时会达到最大值
【发布时间】:2021-03-03 11:48:18
【问题描述】:
如何在 Springboot 应用程序中排除故障/优化 CPU 使用率。对于拥有大约 30 万用户群的应用程序,分配的资源是否足够?该应用程序一点也不重。它只是调用第三方 API 并进行必要的检查并给出响应。
如何识别可能使用比通常所需更多资源的确切代码?我在某处发现从 top 命令跟踪进程 id 并到达线程转储并查找可能使用更多 CPU 的 processid 的相应十六进制值是一种解决方法。这并不容易实现,因为建议的一些命令不起作用。如有任何帮助或建议,我将不胜感激。
提前致谢。
Htop command output
Htop when it's normal
【问题讨论】:
标签:
java
spring
spring-boot
rest
devops
【解决方案1】:
收集线程堆栈的过程对于 Spring Boot 应用程序没有什么不同。在引导应用程序被容器化之前,它仍然是一个 Jar。如果您怀疑实际上是您的应用程序导致了高 CPUT,那么运行您的 jar 并将分析器附加到它并跟踪导致负载高 CPU 的代码。如果做不到,则获取正在运行的 jar/java 进程的线程转储,并使用任何免费或开源工具来分析跟踪。解释的第二个逻辑也适用于容器化应用程序。
按照以下步骤获取在 docker 容器中运行的 java 应用程序/启动应用程序的线程转储:-
docker exec -it <containerName> jstack > someFile.txt
为它拍摄多个快照以获得更好的可见性和比较。
【解决方案2】:
如果您尚未在 JVM 命令行中添加 JMX 启用选项,请从以下开始:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=10000
-Dcom.sun.management.jmxremote.rmi.port=10000
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
然后在本地计算机上,从 JDK bin 文件夹启动“jmc”并连接到 Spring Boot 服务器。
然后,您将能够查看所有线程并在所有活动线程上启用 CPU 负载和线程锁定。
请注意,尽管上述内容会为未经身份验证的条目打开 JVM,因此请确保端口安全。
接下来,如果您的 JVM 死机,则发送“kill -3” SIGHUP,这将告诉 JVM 转储内核。然后可以通过 Eclipse MAT 插件读取,以分析 JVM 内部行为。
另一种方法是将 jolokia 安装到您的服务器中,以便通过其他方式检索相同的信息。