¿Cómo habilitar JMX para la aplicación Java que se ejecuta en el clúster de Kubernetes?

Muchas veces queremos monitorear la utilización de la CPU de nuestra aplicación, el comportamiento de subprocesos en segundo plano y, lo que es más importante, el consumo de memoria para tareas que manejan cargas de datos (500 MB – 1 GB) o muchos más datos. Tal monitoreo ayuda a encontrar qué operación está causando una gran utilización de la CPU o la memoria y ayuda a encontrar la razón detrás de los problemas de fuga de memoria o errores de falta de memoria. Para que nuestra aplicación java esté lista para el análisis, una forma es habilitar el puerto JMX para la aplicación y monitorear su rendimiento usando herramientas java como JvisualVM, JConsole, que son paquetes con JDK y se pueden usar fácilmente desde máquinas externas que tengan jdk instalado. A continuación se muestra la guía para habilitar JMX manualmente y los pasos para configurar jvisualvm y jconsole. Conectarse a estas herramientas de monitoreo y ver el consumo de CPU, memoria y subprocesos es el primer paso para comenzar a resolver cualquier problema relacionado con el rendimiento en el sistema. Para un análisis más detallado, es posible que necesitemos analizar volcados de memoria en montón utilizando herramientas de análisis de memoria como Eclipse Memory Analyzer o herramientas gratuitas en línea. Se identifica un problema de qué objetos de clase están ocupando demasiado espacio, puede profundizar en el código de su sistema para solucionar el problema. Podría ser un error en el modelo de la base de datos o en el código Java, que depende del tipo de problema y la aplicación. 

A continuación se muestran los pasos para habilitar jmx manualmente configurando la variable de entorno

Paso 1: edite my-app-deployment.yaml ejecutando el siguiente comando.

kubectl edit deployment my-app-deployment

En la sección de entornos del contenedor, agregue el siguiente parámetro (cambie NODE_NAME en consecuencia y use cualquier puerto no utilizado: 9991)

– nombre: JAVA_TOOL_OPTIONS

 valor: -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=<NOMBRE_NODO>

Si desea generar Heap Dump para analizar problemas relacionados con la memoria como «Error de falta de memoria», proporcione el valor de JAVA_TOOL_OPTIONS como se muestra a continuación:

valor: -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=<nombre-host> -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps /heapdumpJ.hprof

Y monte el /dumps como el siguiente bloque:

(Si no desea montar, use una carpeta existente del contenedor como la carpeta /tmp en lugar de /dumps)

montajes de volumen:

– nombre: volcados de montón

ruta de montaje: / volcados

volúmenes:

– nombre: volcados de montón

Después de guardar los cambios en la implementación, Kubernetes volverá a implementar automáticamente todos los pods con los nuevos cambios.

Paso 2: edite my-app-svc.yaml ejecutando el siguiente comando

servicio de edición de kubectl my-app-svc

Agregue tipo: NodePort y exponga nodePort, consulte el ejemplo a continuación my-app-svc.yaml

apiVersión: v1

tipo: Servicio

metadatos:

 nombre: mi-aplicación-svc

 espacio de nombres: <espacio de nombres>

Especificaciones:

 tipo: puerto de Node

 puertos:

   – nombre: puerto principal

     puerto: 9992

     protocolo: TCP

  – puerto: 9991

     NodePuerto: 9991

     protocolo: TCP

     nombre: jconsole-puerto

 selector:

   aplicación: mi-aplicación

Después de guardar los cambios en la implementación, Kubernetes reiniciará automáticamente el servicio con nuevos cambios.

Paso 3: Ejecute el siguiente comando y verifique que el puerto 9991 esté disponible.

kubectl get service -n <espacio de nombres> | grep mi-aplicación-svc 

Una vez que JMX esté habilitado para su aplicación, conéctese a cualquier herramienta de análisis de rendimiento para monitorear la CPU, la memoria y el uso de subprocesos de la aplicación.

Ejecutando JConsole

  1. Ejecute jconsole.exe
  2. Debería aparecer la ventana de JConsole.
  3. Haga clic en Proceso remoto e ingrese el siguiente valor, reemplace el nombre de host a continuación con su nombre de host.
  4. Haga clic en Conectar. Seleccione la conexión no segura. Luego, jconsole carga la CPU, la memoria, la utilización de subprocesos y todas las métricas relacionadas con el rendimiento: –

Ejecutando JVisualVM

  1. Ejecute jvisualvm.exe
  2. Haga clic con el botón derecho en Remoto y seleccione Agregar host remoto.
  3. Introduzca su nombre de host.
  4. El host debería aparecer ahora en la sección Remoto.
  5. Haga clic con el botón derecho en el host recién agregado y seleccione Agregar JMX.
  6. Ingrese el <nombre de host>:<puerto> para la conexión, reemplazando el nombre de host y el puerto con su servidor real.
  7. Seleccione No requiere una conexión SSL.
  8. Haga clic en Aceptar.
  9. Después de hacer esto, debería aparecer una nueva entrada debajo del host, seleccionarla le dará una descripción general del perfil remoto.

Ya está todo listo para realizar un análisis de rendimiento de su aplicación Java implementada en el clúster de Kubernetes.

Publicación traducida automáticamente

Artículo escrito por harshitaagrawal2 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *