问题描述
我正在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
的输出进行排序。您可以使用任何其他字段(例如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。如果您在Pod上运行pmap -x <pid>
,ps -La -p <pid>
,则可以进一步了解Java应用程序如何“浪费” RAM。
值得检查java -XX:+PrintFlagsFinal -version | grep Heap
并根据Dashrath Mundkar的建议进行调整(如果您想减少pod
中JVM分配的内存。