java - 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 变得非常高有两个原因。
- Constant GC - (我们的应用程序中没有 Full GC)
- 在应用程序中循环 -(在我们的应用程序中没有找到循环)
现在为了缓解 CPU 峰值,我们做了以下活动,但得到了相同的 CPU 利用率(100%)。
- 将 Springboot 版本从 2.2.0 升级到 2.3.1(由 Stackoverflow 线程之一建议)
- 还使用 Oracle JDK 8 代替 OpenJDK11 来降低 C1 和 C2 编译器的线程利用率。
- 将 Springboot Embedded tomcat 更改为 undertow。
我们是否缺少任何配置?非常感激你的帮助!