Spring 启动内存计算器不使用容器内存限制

Spring Boot Memory Calculator does not use container memory limits

我是 运行 我使用 spring-boot-maven-plugin 2.5.0 构建的 kubernetes 容器。 我尝试使用 paketobuildpacks/builder 0.1.127-base0.1.115-base.

当我启动 pod 时,它显示以下内容:

Calculating JVM memory based on 3353816K available memory

然而这些是由 kubectl describe pod 返回的 requests/limits:

    Limits:
      cpu:     500m
      memory:  1Gi
    Requests:
      cpu:      500m
      memory:   1Gi

我读到内存计算器应该基于这些内存限制。 我该怎么做才能让内存计算器根据容器内存进行计算? 希望有人能帮我解决这个问题。

答案将由三部分组成。

Kubernetes

正如您正确指出的那样,容器可以检测调度 pod 的所有节点的内存。

$ free -h # run in host OS
              total        used        free      shared  buff/cache   available
Mem:           3.8G        949M        1.3G        2.0M        1.6G        2.7G
Swap:            0B          0B          0B
$ kubectl exec -it ubuntu2 -- free -h # run in a pod's container
              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       961Mi       1.3Gi       2.0Mi       1.6Gi       2.7Gi
Swap:            0B          0B          0B

如果 requestslimits 且未指定,容器可以消耗所有节点的内存(以及 cpu)。什么负责什么:

  • requests - 在工作节点上调度带有容器的 pod 所需的最小内存量。这应该是一个合理的数字,因为如果它太大,调度程序将很难找到可以启动此 pod 的节点。容器有可能消耗比请求更多的内存。

  • limits - 限制分配给容器的最大内存量。一旦容器超过限制,它将被驱逐并重新创建。

Motivation for memory requests and limits

Kubernetes 中的 JVM 应用程序

过去当 java 应用程序托管在本地实例上时,众所周知有多少内存可用以及允许应用程序消耗多少内存。

由于所有集群都不同并且容器可以看到工作节点上的全部内存量,因此应该定义 JVM 内存选项。在使用 requestslimits 的 kubernetes 中,可以为应用程序的容器提供确切所需的内存量,并将其与分配的 JVM heap memory.

相匹配

有不同的选项可用于设置 JVM 选项。最常见的与堆内存相关的是:

Explicit Heap Memory – Xms and Xmx Options

如何传递给kubernetes中的容器

Whosebug 上已经有两个解决类似问题的好答案。

Answer 1Answer 2

简而言之,他们介绍了如何使用 kubernetes environment variables 将选项传递给 JVM,例如-Xms-Xmx.

有用的链接:

(请熟悉):

问题是因为内存计算器不适用于 cgroups v2。 我的同事在 https://github.com/paketo-buildpacks/libjvm/pull/82

为构建包创建了拉取请求

现在我们更改了一些内核参数,以便使用旧的命名约定。