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
- Limita a que el usuario especificado no pueda iniciar más de 5 procesos (fallará al fork)
nthr
- Limita a que el usuario especificado no pueda ejecutar más de 5 hilos
# rctl -a user:<NOMBRE DE USUARIO>:nthr:deny=5
- Limita a que el usuario especificado no pueda ejecutar más de 5 hilos
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.