【问题标题】: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

【问题讨论】:

  • 您好 Sarjib,我认为 JVM Profiler 工具可以帮助您找到资源或性能问题的原因。 JDK 带有一个免费的 Profiler。该网站可以帮助您了解有关 Profiler 工具的更多信息。祝你好运。 baeldung.com/java-profilers

标签: 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 安装到您的服务器中,以便通过其他方式检索相同的信息。

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多