如何找到Pod的最大内存?

时间:2018-12-24 06:38:03

标签: memory kubernetes jvm

我有一个在kubernetes中运行的JVM应用程序。当我运行kubectl top pod时,我会看到以下内容

mypod1                    12m          6035Mi
mypod2                    11m          6129Mi
mypod3                    11m          6334Mi

我想知道6GB的内存好坏。我的kubernetes部署yaml没有指定任何资源

问题

  • 如何找出最大数目?
  • 如何确定jvm是否运行良好?
  • 是否有可以连接到Pod中运行的jvm的探查器?

2 个答案:

答案 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和应用程序指标。除了JolokiaPrometheus 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公开相关端口来连接探查器