我有一个在kubernetes中运行的JVM应用程序。当我运行kubectl top pod
时,我会看到以下内容
mypod1 12m 6035Mi
mypod2 11m 6129Mi
mypod3 11m 6334Mi
我想知道6GB的内存好坏。我的kubernetes部署yaml没有指定任何资源
问题
答案 0 :(得分:1)
问题1:“如何找出最大数目?
答:在部署中未配置resources
的情况下,pod将具有BestEffort的QoS类,并且可以使用其正在运行的节点上可用的内存。另请参阅我对这个问题的回答:How can I tell how much RAM my Kubernetes pod has?
恕我直言,始终最好至少指定最小(-Xms
)和最大(-Xmx
)JVM堆...
问题2:“如何找出jvm是否运行良好? 答:您可以先启用JMX,然后使用它来收集JVM和应用程序指标。除了Jolokia和Prometheus JMX Exporter之类的JMX到HTTP的桥接之外,它也是直接通过JMX连接的一种选择。一种方法是:
通过配置以下JVM启动参数来公开JMX:
-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=4444 -Djava.rmi.server.hostname=127.0.0.1
请注意,这会附加其他情况下的动态RMI端口并为RMI服务器设置主机名。
将本地端口转发到Pod上的以下端口:
kubectl --namespace=<namespace> port-forward <pod-name> 4444:4444 1099:1099
在本地启动可以通过JMX连接到Pod中的JVM的工具(jconsole,jvisualvm,jmc ...根据可用的资源)。 JMX URL将是:
service:jmx:rmi://127.0.0.1:4444/jndi/rmi://127.0.0.1:1099/jmxrmi
问题3:“是否有可以连接到Pod中运行的jvm的探查器?” 答:简短的答案是“是”。我已经使用JProfiler通过端口转发远程分析了在k8s上运行的Java应用程序。 (我不隶属于JProfiler,也不在推广它-这只是我所帮助的团队获得许可的工具)
答案 1 :(得分:-1)
您可以使用Vertical Pod Autoscaler来根据容器的使用情况自动更新CPU /内存限制。
要获取JVM指标,我建议您在服务器中安装一些prometheus插件并抓取指标。然后,您可以查看有多少个对象处于活动状态以及世代信息,以便更好地了解内存使用情况的原因以及如何对其进行控制。
您可以通过使用kubectl proxy
公开相关端口来连接探查器