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:
- Instalar los paquetes de cgroups+pam. En Debian, cgroup-bin y libpam-cgroup
- 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
- 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; } }
- 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
- Probar las definiciones con cgexec (y un programa adecuado, que intente sobrepar las limitaciones):
cgexec -g memory:common_mem_pool mem_eater
- 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
- 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)
- 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:
- Cómo gestiona la memoria el kernel
- kernel.org / cgroups: Subsistema controlador de memoria, CPU bandwitdth control
- Guía de gestión de recursos de RHEL, sección memoria
- OOM Killer
- Excluir procesos de la lista negra de OOM killer, con cgroups
- cgroups en RedHat
- Systemd resources (0pointer), Systemd resources (Freedesktop)
- cgroup version 2