Case study: Incompatibilidad de versiones de Java anteriores a jdk8u372 con Cgroup v2

En Geko Cloud nos enorgullece mantenernos a la vanguardia de las tecnologías emergentes y las mejores prácticas de la industria. Recientemente, nos encontramos con un desafío interesante: el uso de Cgroup v2 causó incidencias en ciertas aplicaciones que no estaban preparadas para trabajar con esta versión, especialmente si se utilizaban versiones de Java anteriores a jdk8u372. 

 

Este problema se hizo particularmente relevante cuando en uno de nuestros clientes actualizamos los nodos del cluster EKS a Ubuntu 21.10, que viene con Cgroup v2 activado por defecto.

 

¿Qué es Cgroup?

Cgroup, que significa «grupo de control», es un mecanismo del kernel de Linux que permite organizar los procesos de manera jerárquica y distribuir los recursos del sistema a lo largo de la jerarquía, de manera controlada y configurable. 

 

Cgroup está compuesto en gran parte por dos partes: el núcleo y los controladores. El núcleo de Cgroup es, principalmente, responsable de organizar jerárquicamente los procesos. Un controlador de Cgroup, generalmente, es responsable de distribuir un tipo específico de recurso del sistema a lo largo de la jerarquía.

 

Cgroup v1 vs Cgroup v2

A continuación, se presentan algunas de las diferencias clave entre Cgroup v1, la versión original, y Cgroup v2, la nueva generación de la API:

 

Características
Cgroup v1
Cgroup v2
Jerarquía Múltiple Única
Delegación de subárboles Menos segura Más segura  
Información de presión de parada No disponible Disponible
Gestión de la asignación de recursos Menos eficiente Mejorada
Contabilidad unificada para diferentes tipos de asignaciones de memoria No disponible Disponible
Contabilidad para cambios de recursos no inmediatos No disponible Disponible

 

Problemas con versiones de Java anteriores a jdk8u372 y Cgroup v2

Uno de los problemas más comunes que pueden surgir al usar versiones de Java anteriores a jdk8u372 con Cgroup v2 es el aumento del consumo de memoria. 

Este aumento en el uso de la memoria puede provocar la evicción de pods y presión sobre la memoria dentro de un nodo. En algunos casos, esto puede llevar a que se agoten los recursos del sistema, afectando negativamente el rendimiento de las aplicaciones. Este fue precisamente el problema que encontramos en Geko Cloud.

 

Solución

La solución ideal sería actualizar todas las versiones de Java a jdk8u372 o superior. Sin embargo, en caso de que no sea posible y nos encontremos con el problema, una solución alternativa sería volver a utilizar Cgroup v1. 

Para hacer el cambio de Cgroup en Ubuntu, puedes seguir los siguientes pasos:

Estos comandos configuran el sistema para usar la versión anterior de Cgroup (v1) y luego reinician el sistema para aplicar los cambios, como hicimos desde Geko Cloud para resolver la incidencia de nuestro cliente.

 

Validación

Para validar qué versión de Cgroup está utilizando, puedes usar el siguiente comando:

La salida variará dependiendo de la versión de Cgroup que esté utilizando. A continuación, se muestran ejemplos de cómo se vería para Cgroup v2 y Cgroup v1 (modo híbrido):

 

Cgroup v2

 

Cgroup v1 (modo híbrido)

Esperamos que esta guía te haya sido útil para entender y solucionar los problemas relacionados con el uso de versiones de Java anteriores a jdk8u372 con Cgroup v2. En Geko Cloud estamos comprometidos con la resolución de problemas y la mejora continua. 

Si tienes alguna pregunta o necesitas más detalles, no dudes en contactar con nosotros o dejar un comentario.

Deja una respuesta

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