首页 > 解决方案 > Spring Boot 应用程序使用 100% CPU

问题描述

我们有springboot应用程序。当我们尝试对我们的应用程序进行负载测试时,它的 CPU 超过了 100%(总体最大 101%)。

我们正在使用 docker stats 命令测量 CPU 利用率。因此,对于 2 个核心,它应该使用最多 200 个。如果 Docker 统计数据显示为 200,这意味着它正在使用 100% 的两个核心。我们的应用程序使用 200/200(意味着 100%)。

资源详情

CPU - 2 核

JVM 内存大小 - 2GB

版本

java - Openjdk11

Springboot - 2.2.0.RELEASE

我们正在使用 Jmeter Plan 进行负载测试。

Jmeter 策略是

主题 - 5

每分钟对应用程序的总请求 - 60,000

每秒对应用程序的总请求数 - 1000

应用程序的平均响应时间为 - 4ms

在我们的负载测试中,我们在下面观察到

CPU 使用率统计(快照之一)

5 个 Tomcat 可运行线程 - 总 CPU - 45%(Docker 统计数据 - 90/200)

5 个 Tomcat 等待线程 - 总 CPU - 40%(Docker 统计数据 - 80/200)

除上述之外,以下 JVM 线程占用最大 CPU。由于也有以下线程,CPU 变得非常高。

C2 CompilerThread0(最高 CPU)

销毁JavaVM

C1 编译器线程0

现在一般来说,CPU 变得非常高有两个原因。

  1. Constant GC - (我们的应用程序中没有 Full GC)
  2. 在应用程序中循环 -(在我们的应用程序中没有找到循环)

现在为了缓解 CPU 峰值,我们做了以下活动,但得到了相同的 CPU 利用率(100%)。

  1. 将 Springboot 版本从 2.2.0 升级到 2.3.1(由 Stackoverflow 线程之一建议)
  2. 还使用 Oracle JDK 8 代替 OpenJDK11 来降低 C1 和 C2 编译器的线程利用率。
  3. 将 Springboot Embedded tomcat 更改为 undertow。

我们是否缺少任何配置?非常感激你的帮助!

标签: javaspring-boot

解决方案


推荐阅读