代码之家  ›  专栏  ›  技术社区  ›  Anthony

如何找到最大的内存为POD?

  •  0
  • Anthony  · 技术社区  · 6 年前

    我有一个在kubernetes中运行的JVM应用程序。当我跑的时候 kubectl top pod 我可以看到

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

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

    问题

    • 我怎样才能找到它能达到的最大数量?
    • 我怎样才能知道jvm是否运行良好?
    • 有没有可以连接到pods中运行的jvm的profiler?
    2 回复  |  直到 6 年前
        1
  •  1
  •   apisim    6 年前

    问题1:“我怎样才能找到它能达到的最大数量?” A: 没有 resources 在部署中配置,一个pod将拥有尽可能多的QoS类,并且可以使用其运行所在节点上可用的内存。另见我对这个问题的回答: How can I tell how much RAM my Kubernetes pod has?

    这是一个很好的实践,IMHO,至少指定最小值( -Xms )还有马克斯( -Xmx )JVM堆。。。

    问题2:“如何确定jvm是否运行良好?” A: 您可以从启用JMX开始,然后使用它来收集JVM和应用程序度量。除了JMX到HTTP的桥之外 Jolokia Prometheus JMX Exporter ,它也是通过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:“是否有一个profiler可以连接到pods中运行的jvm?” A: 简短的回答是“是”。我使用JProfiler通过端口转发来远程评测运行在k8s上的Java应用程序。(我不隶属于JProfiler,也不推广它——它只是我帮助的团队获得许可证的工具)

        2
  •  -1
  •   codebreach    6 年前

    您可以使用垂直吊舱自动缩放器根据容器的消耗自动更新CPU/内存限制。

    为了获得JVM度量,我建议在服务器中安装一些prometheus插件并删除这些度量。然后,您可以看到有多少对象是活动的和分代的信息,以便更好地理解内存使用的原因以及如何控制内存使用。

    通过使用 kubectl proxy