Gestión de recursos en Debian

Una forma sencilla de controlar el uso de recursos es con ulimit o pam_limits (en /etc/security/limits.conf, y los servicios de /etc/pam.d pertinentes)

Si queremos gestionar recursos como el tráfico de red, los dispositivos o la entrada/salida; o necesitamos flexibilidad para afinar a qué procesos aplicar restricciones, podemos recurrir a los grupos de control (cgroups)

Las opciones con cgroups son múltiples (ver documentación al final). Una de ellas es asignar las restricciones por usuarios / grupos (en la tradición pam). Para ello, los pasos a seguir son:

  1. Instalar los paquetes de cgroups+pam. En Debian, cgroup-bin y libpam-cgroup
  2. Si vamos a usar el controlador de memoria, habilitarlo en grub: añadir “cgroup_enable=memory swapaccount=1” a GRUB_CMDLINE_LINUX_DEFAULT en /etc/default/grub, ejecutar update-grup y reiniciar
  3. Definir los grupos en /etc/cgconfig.conf:
    # Ejemplo sencillo: el grupo common_mem_pool solo puede usar 192GB de RAM.
    # Si un proceso del grupo se encuentra se recursos, se queda en pausa
    # (en lugar de recurrir al OOM killer)
    # Es importante limitar también el swap, ya que si no los procesos empiezan a tirar de él
    # cuando copan la RAM delimitada...
    group common_mem_pool {
            memory {
                   memory.oom_control = 1;
                   memory.limit_in_bytes = 210G;
                   memory.memsw.limit_in_bytes = 210G;
            }
    }
    
  4. Incorporar los cambios de cgconfig.conf con
    cgconfigparser -l /etc/cgconfig.conf
    

    Para configurar la ejecución automática de cgconfigparser durante el arranque, podemos añadir la línea anterior a /etc/rc.local

  5. Probar las definiciones con cgexec (y un programa adecuado, que intente sobrepar las limitaciones):
    cgexec -g memory:common_mem_pool mem_eater
    
  6. Definir las reglas de asignación de grupos en /etc/cgrules.conf:
    # Sintaxis:
    # usuario:nombre_proceso controlador grupo
    # Si el grupo de control no está definido en cgconfig, pam se quejará con algo tipo
    # "cannot make/remove an entry for the specified session"
    
    # Aplicar al usuario alex y al grupo devel las restricciones de common_mem_pool
    alex        memory          common_mem_pool
    @devel        memory          common_mem_pool
    
  7. Habilitar pam-cgroup en los ambitos pertinentes. Por ejemplo, si los usuarios acceden por ssh, en /etc/pam.d/sshd:
    session    required   pam_cgroup.so
    

    (otras posibilidades interesantes son /etc/pam.d/su y /etc/pam.d/sudo)

  8. Configurar el montaje del sistema de ficheros /sys/fs/cgroup. Si tenemos instalado Docker en el sistema, /etc/init.d/docker ya se encarga de montarlo. Si no, lo más sencillo es añadir a cgconfig.conf algo tipo…
    # Si ya está montado, cgconfigparser da un error (tipo "request came in from non owner").
    # En cuyo caso, lo más simple es comentar esta sección
    mount {
            cpu = /sys/fs/cgroup;
            memory = /sys/fs/cgroup;
            cpuacct = /sys/fs/cgroup;
    }
    

Para obtener información relacionada con cgroups, disponemos de los siguientes comandos:

# ver grupos de control de los procesos
ps -O cgroup
# grupos disponibles
cat /proc/cgroups
lscgroup
# informacion sobre un grupo en particular
cgget common_mem_pool

Los controladores a priori más apetecibles son cpu, memory (ver ejemplo más arriba) y blkio:

  • cpu.shares: porcentaje de CPU para el grupo
  • blkio.weight: porcentaje de E/S para el grupo
  • blkio.throttle.read_bps_device, blkio.throttle.read_iops_device, blkio.throttle.write_bps_device, blkio.throttle.write_iops_device: límite de velocidad (en bytes por segundo) en acceso a un dispositivo

Para adaptar el funcionamiento del OOM killer, podemos modificar indirectamente oom_score ajustando el parametro oom_adj de los procesos (-17 si queremos apartar al proceso de la mira de OOM, -16 si queremos que su muerte sea muy poco probable, 15 si muy probable). Ruth (root) juega con ventaja, por defecto a sus procesos se les reduce su probabilidad de ser exterminados por OOM.

Para saber más…

cgroups:

Memoria:

Deja un comentario

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