Nuestros mejores programadores agotaron sus reservas de café, por su búsqueda noche y día por la solución, hasta que Asia halló el resultado en GitLab así que en este momento la comparte aquí.
Solución:
puede limitar el uso de la memoria mediante la opción -Xmx y puede limitar el uso de la CPU configurando la prioridad del proceso y/o la afinidad de la CPU.
La JVM no tiene control sobre el uso de la CPU ni sobre la prioridad.
JVM tiene control sobre el uso máximo/mínimo de memoria.
Hay una solución. Es posible ejecutar cada JVM en un separado [Docker container][1]. Y controle la asignación de recursos (memoria, CPU, red, IO) para cada contenedor. Ese es exactamente el valor añadido de los contenedores Docker.
[1]: La JVM no tiene control sobre el uso de la CPU ni sobre la prioridad. Sin embargo, puede ejecutar cada JVM en un contenedor Docker separado. Y controle la asignación de recursos para cada contenedor. Ese es exactamente el valor añadido de los contenedores Docker.
Docker ofrece opciones de administración de recursos para limitar el acceso a la CPU para ejecutar contenedores docker. Eche un vistazo a las opciones del programador CFS disponibles con docker run
de Limitar los recursos de un contenedor en la documentación de Docker, como:
--cpus=
– Especifique la cantidad de recursos de CPU disponibles que puede usar un contenedor. Por ejemplo, si la máquina host tiene dos CPU y configura--cpus="1.5"
, el contenedor está garantizado como máximo una y media de las CPU. Esto es el equivalente a establecer--cpu-period="100000"
y--cpu-quota="150000"
. Disponible en Docker 1.13 y superior.--cpuset-cpus
– Limite las CPU o núcleos específicos que puede usar un contenedor. Una lista separada por comas o un rango separado por guiones de CPU que puede usar un contenedor, si tiene más de una CPU. La primera CPU tiene el número 0. Un valor válido podría ser0-3
(para usar la primera, segunda, tercera y cuarta CPU) o1,3
(para usar la segunda y cuarta CPU).
Estas opciones también están disponibles a través de docker-compose, al implementar un enjambre/pila de Docker, como se menciona en la referencia de la versión 3 del archivo Compose en resources
:
version: '3' services: redis: image: redis:alpine deploy: resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M```
Nota: que las opciones de recursos heredados en docker compose v2 ahora están limitadas a pilas en la migración a v3.