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内存使用量一直在增长,直到达到一定的极限,然后保持不变。

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

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

您可以在kubectl exec -it <pod_name> -- top -o RES -n1 | head命令的帮助下检查到底发生了什么。在这个例子中,我用RES字段对top的输出进行排序。您可以使用任何其他字段(例如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。您可以更深入地了解RAM究竟是如何";浪费的";如果您在pod上运行pmap -x <pid>ps -La -p <pid>,则通过java应用程序。

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

以下资源1、2、3在这里可能有用。

最新更新