如何为运行在 Kubernetes 集群中的Java应用程序启用 JMX?
很多时候,我们想要监控应用程序的 CPU 利用率、后台线程行为,以及最重要的是处理数据负载 (500MB – 1GB) 或更多数据的任务的内存消耗。此类监控有助于找出导致 CPU 或内存使用率过高的操作,并有助于找出内存泄漏问题或内存不足错误背后的原因。为了使我们的Java应用程序准备好进行分析,一种方法是为应用程序启用 JMX 端口并使用Java工具(如 JvisualVM、JConsole)监控其性能,这些工具是带有 JDK 的软件包,可以从安装了 jdk 的外部机器轻松使用。以下是手动启用 JMX 的指南以及配置jvisualvm和jconsole的步骤。连接到这些监控工具并查看 CPU、内存、线程消耗是开始解决系统中任何与性能相关的问题的第一步。为了进一步分析,我们可能需要使用 Eclipse Memory Analyzer 等内存分析工具或在线免费工具来分析内存堆转储。一个问题是哪些类对象占用了太多空间,您可以更深入地研究系统代码来解决该问题。它可能是数据库模型或Java代码中的错误,这取决于问题和应用程序的类型。
以下是通过设置环境变量手动启用jmx的步骤
第 1 步:编辑my-app-deployment.yaml 。在容器的环境部分中,添加以下参数(相应地更改 NODE_NAME 并使用任何未使用的端口:9991)
– name: JAVA_TOOL_OPTIONS
value: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9991 -Dcom.sun.management.jmxremote.rmi.port=9991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=
如果要生成 Heap Dump 来分析内存相关的问题,例如“Out of Memory error”,请给出 JAVA_TOOL_OPTIONS 的值,如下所示:
value: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9991 -Dcom.sun.management.jmxremote.rmi.port=9991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=
并安装 /dumps 如下块:
(如果您不想挂载,请使用容器的现有文件夹,例如 /tmp 文件夹而不是 /dumps)
volumeMounts:
– name: heap-dumps
mountPath: /dumps
volumes:
– name: heap-dumps
第 2 步:编辑 my-app-svc.yaml
添加类型:NodePort 并暴露 nodePort,参考下面的示例 my-app-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
namespace:
spec:
type: NodePort
ports:
– name: main-port
port: 9992
protocol: TCP
– port: 9991
nodePort: 9991
protocol: TCP
name: jconsole-port
selector:
app: my-app
第 3 步:运行以下命令以重新启动 pod 和服务
kubectl delete -f my-app-deployment.yaml;
kubectl create -f my-app-deployment.yaml;
kubectl delete -f my-app-svc.yaml;
kubectl create -f my-app-svc.yaml;
重新启动可能需要一些时间。
第 4 步:运行以下命令并检查 9991 端口是否可用。
kubectl get service -n
为您的应用程序启用 JMX 后,连接到任何性能分析工具以监控应用程序的 CPU、内存、线程使用情况。
运行 JConsole
- 运行 jconsole.exe
- 应出现 JConsole 窗口。
- 单击远程进程并输入以下值,将下面的主机名替换为您的主机名。
- 单击连接。选择不安全的连接。然后 jconsole 加载 CPU、内存、线程利用率所有与性能相关的指标:-
运行 JVisualVM
- 运行 jvisualvm.exe
- 右键单击远程并选择添加远程主机。
- 输入您的主机名。
- 主机现在应该出现在远程部分下。
- 右键单击新添加的主机并选择添加 JMX。
- 输入
: 进行连接,将主机名和端口替换为您的实际服务器。 - 选择不需要 SSL 连接。
- 单击确定。
- 完成此操作后,主机下方应出现一个新条目,选择它将提供远程配置文件概述。
您已准备好对部署在 Kubernetes 集群中的Java应用程序进行性能分析。