POD是否将读取的文件缓存在POD内存中的容器中?

问题描述

我正在K8S POD中运行一个应用程序。 尽管应用程序的内存使用量受到限制,但事件仍会持续增长,POD的内存使用量会增长到一定的限制,然后保持不变。

应用程序读取很多输入文件后将其关闭

为什么我们的POD内存使用率如此之高? POD是否在OS等POD内存中缓存文件? 我正在使用Linux容器。

解决方法

我不这样认为,因为豆荚本质上是短暂的。就我的观点而言,pod不会因文件而导致内存问题。如果是Java应用程序,则必须通过将JAVA_OPTS设置为env来限制堆的使用,并在部署文件中设置最大内存限制。像这样

env:
- name: JVM_OPTS
  value: "-Xms1048M -Xmx2048M"   # here xms value means starting memory for jvm and it can use upto 2048

这是非常棒的文章https://banzaicloud.com/blog/java-resource-limits/

,

即使应用程序的内存使用量受到限制

那只是故事的一半。如果是Java,则还需要考虑JVM。

POD的内存使用量一直增长到一定限制,然后保持不变。

豆荚有限制。您可以在kubectl get pod <pod_name> -o yaml的帮助下获得这些限制(您对“请求”部分感兴趣)。

为什么我们的POD内存使用率如此之高?

您可以借助kubectl exec -it <pod_name> -- top -o RES -n1 | head命令来检查究竟是什么。在这个示例中,我按top字段对RES的输出进行排序。您可以使用任何其他字段(例如VIRTSHR等)。

这是我机器上的示例:

$ kubectl get pod jenkins -o yaml | grep -A2 requests
      requests:
        cpu: 300m
        memory: 512Mi

$ kubectl top pod jenkins
NAME                           CPU(cores)   MEMORY(bytes)   
jenkins                        3m           508Mi    

$ kubectl exec -it jenkins -- top -o RES -n1
...

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                
  6 root      20   0 4478216 449952   8000 S   0.0  5.9  39:11.70 java  

从上面的输出中,您可以看到我的詹金斯豆荚限制为512Mi,消耗约508Mi。如果您在Pod上运行pmap -x <pid>ps -La -p <pid>,则可以进一步了解Java应用程序如何“浪费” RAM。

值得检查java -XX:+PrintFlagsFinal -version | grep Heap并根据Dashrath Mundkar的建议进行调整(如果您想减少pod中JVM分配的内存。

以下资源123在这里可能有用。