我正在K8S POD中运行一个应用程序。事件尽管应用程序内存使用量受到限制,但POD内存使用量正在增长,直到达到某个限制,然后保持不变。
应用程序读取大量输入文件并关闭它们。
为什么我们POD内存使用率如此之高?POD是否像OS一样将文件缓存在POD内存中。?我使用的是Linux容器。
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
的输出进行排序。您可以使用任何其他字段(例如VIRT
、SHR
等(。
这是我的机器的例子:
$ 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在这里可能有用。