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

When running spring-boot container on kubernetes active processor count is set with host CPU, not k8s cpu limit for container

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

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

Docker 启动日志显示

Setting Active Processor Count to 32

[...]

Picked up JAVA_TOOL_OPTIONS: [...] -XX:ActiveProcessorCount=32

在 spring-boot-admin 中查看 Web 服务器(netty 用于反应,undertow 用于 servlet)配备线程池,就好像应用程序 运行ning on 32 CPUs 分配容器,即使容器被 k8s 限制为 1 CPU。 OTH 分配给 JVM 的内存是正确的。

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

提前致谢

根据您包含的输出,您似乎正在使用构建包(即 ./mvnw spring-boot:build-image./gradlew bootBuildImagepack build)。

在这种情况下,您可以将环境变量 JAVA_TOOL_OPTIONS 设置为 -XX:ActiveProcessorCount=x 以覆盖默认计算。默认计算将提取处理器总数(由 Go 的 runtime.NumCPU() 函数报告)。

旁注。您的要求似乎很合理,所以我 opened an issue 看看我们是否可以启用它来检测有限的 CPU 计数。