Spring 启动内存计算器不使用容器内存限制
Spring Boot Memory Calculator does not use container memory limits
我是 运行 我使用 spring-boot-maven-plugin 2.5.0
构建的 kubernetes 容器。
我尝试使用 paketobuildpacks/builder 0.1.127-base
和 0.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
如果 requests
和 limits
且未指定,容器可以消耗所有节点的内存(以及 cpu)。什么负责什么:
requests
- 在工作节点上调度带有容器的 pod 所需的最小内存量。这应该是一个合理的数字,因为如果它太大,调度程序将很难找到可以启动此 pod 的节点。容器有可能消耗比请求更多的内存。
limits
- 限制分配给容器的最大内存量。一旦容器超过限制,它将被驱逐并重新创建。
Motivation for memory requests and limits
Kubernetes 中的 JVM 应用程序
过去当 java 应用程序托管在本地实例上时,众所周知有多少内存可用以及允许应用程序消耗多少内存。
由于所有集群都不同并且容器可以看到工作节点上的全部内存量,因此应该定义 JVM
内存选项。在使用 requests
和 limits
的 kubernetes 中,可以为应用程序的容器提供确切所需的内存量,并将其与分配的 JVM heap memory
.
相匹配
有不同的选项可用于设置 JVM
选项。最常见的与堆内存相关的是:
Explicit Heap Memory – Xms and Xmx Options
如何传递给kubernetes中的容器
Whosebug 上已经有两个解决类似问题的好答案。
Answer 1 和
Answer 2
简而言之,他们介绍了如何使用 kubernetes environment variables 将选项传递给 JVM
,例如-Xms
和 -Xmx
.
有用的链接:
(请熟悉):
问题是因为内存计算器不适用于 cgroups v2。
我的同事在 https://github.com/paketo-buildpacks/libjvm/pull/82
为构建包创建了拉取请求
现在我们更改了一些内核参数,以便使用旧的命名约定。
我是 运行 我使用 spring-boot-maven-plugin 2.5.0
构建的 kubernetes 容器。
我尝试使用 paketobuildpacks/builder 0.1.127-base
和 0.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
如果 requests
和 limits
且未指定,容器可以消耗所有节点的内存(以及 cpu)。什么负责什么:
requests
- 在工作节点上调度带有容器的 pod 所需的最小内存量。这应该是一个合理的数字,因为如果它太大,调度程序将很难找到可以启动此 pod 的节点。容器有可能消耗比请求更多的内存。limits
- 限制分配给容器的最大内存量。一旦容器超过限制,它将被驱逐并重新创建。
Motivation for memory requests and limits
Kubernetes 中的 JVM 应用程序
过去当 java 应用程序托管在本地实例上时,众所周知有多少内存可用以及允许应用程序消耗多少内存。
由于所有集群都不同并且容器可以看到工作节点上的全部内存量,因此应该定义 JVM
内存选项。在使用 requests
和 limits
的 kubernetes 中,可以为应用程序的容器提供确切所需的内存量,并将其与分配的 JVM heap memory
.
有不同的选项可用于设置 JVM
选项。最常见的与堆内存相关的是:
Explicit Heap Memory – Xms and Xmx Options
如何传递给kubernetes中的容器
Whosebug 上已经有两个解决类似问题的好答案。
Answer 1 和 Answer 2
简而言之,他们介绍了如何使用 kubernetes environment variables 将选项传递给 JVM
,例如-Xms
和 -Xmx
.
有用的链接:
(请熟悉):
问题是因为内存计算器不适用于 cgroups v2。 我的同事在 https://github.com/paketo-buildpacks/libjvm/pull/82
为构建包创建了拉取请求现在我们更改了一些内核参数,以便使用旧的命名约定。