es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo limitar el uso del espacio de disco para las grabaciones de JFR (Java Flight Recorder) en volcados (dumps) dentro de un contenedor Docker?

Comienzo un vuelo continuo con respecto a mi aplicación de la siguiente manera:

java -XX:StartFlightRecording:filename=jfr-logs/ ...

Cada vez que se detiene la aplicación, se genera un nuevo archivo en el directorio jfr-logs:

ls -l jfr-logs
-rw-r--r-- 1 jumar staff 2.2M Dec 13 09:28 hotspot-pid-57471-id-1-2021_12_13_09_28_01.jfr
-rw-r--r-- 1 jumar staff 1.0M Dec 13 09:28 hotspot-pid-57923-id-1-2021_12_13_09_28_19.jfr

Me gustaría asegurarme de que no haya más de X cantidad de estos archivos y/o que no ocupen más de Y MB de espacio en disco.

Ejecuto esta aplicación en un contenedor Docker y el directorio jfr-logs se almacena en un volumen persistente.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Dado que el directorio jfr-logs se almacena en un volumen persistente, podemos crear un script bash sencillo para comprobar el número de archivos y el espacio total en disco utilizado por el directorio jfr-logs. Aquí tienes un ejemplo:

    #!/bin/bash
    
    # Número máximo de archivos JFR
    MAX_FILES=10
    
    # Espacio total máximo en disco utilizado por los archivos JFR (en MB)
    MAX_DISK_SPACE=100
    
    # Ruta al directorio de registros JFR
    JFR_LOGS_DIR=/ruta/a/jfr-logs
    
    # Obtener el número de archivos JFR y el espacio total en disco utilizado por ellos
    JFR_FILES=$(find "$JFR_LOGS_DIR" -maxdepth 1 -type f -name "*.jfr" | wc -l)
    JFR_DISK_SPACE=$(du -m "$JFR_LOGS_DIR" | cut -f1)
    
    # Comprobar si el número de archivos excede el límite
    if [ "$JFR_FILES" -gt "$MAX_FILES" ]; then
        echo "El número de archivos JFR ($JFR_FILES) excede el límite ($MAX_FILES). Eliminando archivos antiguos..."
        find "$JFR_LOGS_DIR" -maxdepth 1 -type f -name "*.jfr" -exec ls -t {} + | tail -n +$MAX_FILES | xargs rm
    fi
    
    # Comprobar si el espacio total en disco utilizado excede el límite
    if [ "$JFR_DISK_SPACE" -gt "$MAX_DISK_SPACE" ]; then
        echo "El espacio en disco utilizado por los archivos JFR ($JFR_DISK_SPACE MB) excede el límite ($MAX_DISK_SPACE MB). Eliminando archivos antiguos..."
        find "$JFR_LOGS_DIR" -maxdepth 1 -type f -name "*.jfr" -exec ls -t {} + | awk -v max_space="$MAX_DISK_SPACE" '{sum += $1}; sum > max_space {print $2}' | xargs rm
    fi
    

    Este script primero establece el número máximo de archivos JFR (MAX_FILES) y el espacio total máximo en disco utilizado por los archivos JFR en megabytes (MAX_DISK_SPACE). Luego obtiene el número actual de archivos JFR y el espacio total en disco utilizado por ellos utilizando los comandos find y du, respectivamente.

    Si el número de archivos excede el límite, el script elimina los archivos más antiguos hasta que el número de archivos esté por debajo del límite. Si el espacio total en disco utilizado excede el límite, el script elimina los archivos más antiguos hasta que el espacio total en disco utilizado esté por debajo del límite.

    Para ejecutar este script en un contenedor Docker, puedes crear una nueva imagen Docker que incluya este script y cualquier otra dependencia necesaria, y luego ejecutar un contenedor a partir de esta imagen de la siguiente manera:

    docker run -v /ruta/a/jfr-logs:/jfr-logs mi-imagen /ruta/a/check_jfr_logs.sh
    

    Esto montará el directorio jfr-logs del host en /jfr-logs dentro del contenedor y ejecutará el script check_jfr_logs.sh dentro del contenedor. Luego puedes programar este comando para que se ejecute periódicamente utilizando un trabajo cron u una herramienta similar para mantener bajo control el número de archivos JFR y el uso total del espacio en disco.

Comments are closed.