提问者:小点点

当在kubernetes上运行spring-boot容器时,活动处理器计数由主机CPU设置,而不是容器的k8s CPU限制


我们在kubernetes上运行使用bootBuildImage gradle任务创建的Spring Boot容器。我们在k8s启动时为pod提供CPU限制和内存限制。我们使用:

    < li >Spring启动版本2.6.2 < li >使用gradle spring-boot插件bootBuildImage任务构建的docker映像 < li>spring-boot-admin管理我们基于spring-boot的部署 < li>JDK 11(启用blockhound) < li > 32 CPUs台CPU主机 < li >在开发中,我们将容器限制为1个CPU和1gb内存

我们注意到我们所有基于Spring Boot的容器都是预配的(即nb个线程),就好像在32个CPU实例上运行一样。

码头工人启动日志显示

将活动处理器计数设置为 32

[...]

JAVA_TOOL_OPTIONS:[…]-XX: ActiveProcessorCount=32

在Spring启动时,使用see web服务器的管理员(netty表示反应式,underflow表示servlet)配备了线程池,就好像应用程序在32个CPU分配的容器上运行一样,即使容器被限制为1个CPU乘以k8s。OTH分配给JVM的内存是正确的。

我们如何确保活动 CPU 计数反映 k8s CPU 限制?

提前感谢


共1个答案

匿名用户

根据您包含的输出,看起来您正在使用构建包(即./mvnw spfling-引导:构建图像./gradlew bootBuildImage包构建)。

在这种情况下,您可以使用-XX: ActiveProcessorCount=x设置env变量JAVA_TOOL_OPTIONS来覆盖默认计算。默认计算将拉取处理器总数(如Go的runtime. NumCPU()函数所报告的)。

旁注。你的要求似乎很合理,所以我打开了一个问题,看看我们是否可以启用它来检测有限的CPU计数。