Notas sobre las restricciones de recursos en FreeBSD
servidor
Published: 2022-08-10

Como no estaba muy familiarizado, decidí investigar un poco.

En FreeBSD se utiliza RCTL, por lo que se debe utilizar un kernel que tenga habilitado RACCT y RCTL.
El kernel genérico de FreeBSD 13.1 parece estar habilitado, así que lo activaré en loader.conf.

root@freebsd13:~ # grep -E 'RACCT|RCTL' /usr/src/sys/amd64/conf/GENERIC
options         RACCT                   # Marco de contabilidad de recursos
options         RACCT_DEFAULT_TO_DISABLED # Establecer kern.racct.enable=0 por defecto
options         RCTL                    # Límites de recursos

# echo "kern.racct.enable=1" >> /boot/loader.conf
# reboot

Comando rctl

rctl -a Agregar regla
     -r Eliminar
     -u Mostrar valores límites actuales
     -h Amigable para humanos
     Sin especificar Mostrar lista de reglas
     
     La eliminación y la visualización pueden filtrarse con user: o ::maxproc:, etc.
     Ejemplo)
     # rctl user:
     user:admin:pcpu:deny=10

Alcance de las restricciones

Se pueden aplicar restricciones a nivel de proceso, usuario, class de inicio de sesión (loginclass) o cárcel (jail).

  • Restringir a nivel de proceso

    # rctl -a process:<PID>:<resource>:<action>=<amount>
    
    • El límite se hereda a los procesos hijos, pero parece que se restringe a nivel de proceso.
  • Restringir a nivel de usuario

    # rctl -a user:<NOMBRE DE USUARIO>:<resource>:<action>=<amount>
    # rctl -a user:<UID>:<resource>:<action>=<amount>
    
  • Restringir a nivel de proceso para un usuario

    # rctl -a user:<NOMBRE DE USUARIO>:<resource>:<action>=<amount>/process
    # rctl -a user:<UID>:<resource>:<action>=<amount>/process
    

Parece que también se pueden aplicar restricciones a nivel de loginclass y jail.

CPU

  • cputime

    • Utiliza el tiempo de CPU del proceso para las reglas
    • Las acciones que se pueden usar incluyen log, devctl, sig, etc.
    • Registra en el log si el tiempo de CPU del PID supera los 100 segundos
      # rctl -a process:<PID>:cputime:log=100
      
  • pcpu

    • Especifica en porcentaje por núcleo de CPU
    • Al observar con top, no parece que se limite de manera limpia, sino que el promedio parece ser el valor límite.
    • Limita al 20% de CPU por núcleo (así que para 2 núcleos parecería que se puede usar 200%).
      # rctl -a process:<PID>:pcpu:deny=20
      

Control de procesos

  • maxproc

    • Limita a que el usuario especificado no pueda iniciar más de 5 procesos (fallará al fork)
      # rctl -a user:<NOMBRE DE USUARIO>:maxporc:deny=5
      
  • nthr

    • Limita a que el usuario especificado no pueda ejecutar más de 5 hilos
      # rctl -a user:<NOMBRE DE USUARIO>:nthr:deny=5
      

Parece que también se pueden aplicar varios controles sobre la memoria. Dado que los ajustes se perderán al reiniciar, si se desea hacer persistente, parece que se debe escribir en /etc/rctl.conf.