当我们设置 jvm 参数和内存请求以及对容器的限制时,内存管理是如何发生的

how memory management happens when we set jvm arguments and memory requests and limits on container

我已经设置了 pod 定义配置如下。我在容器上设置了堆内存和内存限制,

spec:
  containers:
    - command:
        - sh
        - '-c'
        - >-
          exec java -XX:+UseG1GC -Xms512m -Xmx512m -XX:MaxRAM=640m
      ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        - containerPort: 8443
            name: https
            protocol: TCP
        - containerPort: 8081
            name: management
            protocol: TCP
     resources:
       limits:
         cpu: 200m
         memory: 950Mi
       requests:
         cpu: 100m
         memory: 128Mi

但是 pod 经常因 OOM 而被杀死。在那种情况下,我应该改变什么价值观。无论是资源部分还是堆内存。

还想了解作为 jvm 参数的内存和作为资源的内存如何协同工作。

首先你的配置看起来不错。我认为您不需要“-XX:MaxRAM=640m”。如果您使用的是 Java 10+,您甚至根本不需要这些标志,对于 Java 8,还有一个标志可以帮助您删除这些标志。

我认为您的问题是节点上的实际资源不足,因为 pod 未处于 pending 状态,这意味着至少有 128Mi 空内存 reservation 而不是实际资源。问题可能有 2 个原因:

1:你的爆发不够(200 mcpu,950Mi内存),你的应用程序在启动时崩溃了。这是基于 Java 的应用程序的常见问题,尤其是 Spring Boot。要检查这个从配置中删除内存限制部分,看看你是否仍然有 OOM 杀死。如果这解决了您的问题,那么找到您的应用所需的内存限制的最佳点。

2:您的节点以接近满负荷工作,您的应用保证只有 128Mi,但之后不会太多,因为您可能有更多突发应用在超出请求功率的情况下工作。您可以简单地在节点中使用“free -h”对其进行监控。这就是某些团体认为最好将请求和限制设置为相同以提供稳定性的原因。