Gestión de recursos asignados a procesos
Para los administradores de sistemas el control de recursos es algo fundamental a la hora de planificar, diseñar y administrar los sistemas informáticos.
Si de algún modo fuera posible definir límites de uso de recursos asociados a determinados procesos, o grupos de procesos, tendríamos un campo de control de nuestro sistema operativo muy amplio. Este aspecto es efectivamente gestionado por systemd a través de los units de tipo slice.
Mediante la definición de unit files para este tipo de elemento podremos establecer límites de uso de recursos del sistema informático que pueden ser asignados, y aplicados consecuentemente, a los procesos.
Vamos a ver un ejemplo
Definición de un unit de tipo slice
Empezamos definiendo una unit de tipo slice en /etc/systemd/system/www.slice
[Unit] Description=Limitación de Recursos para servidores web DefaultDependencies=no Before=slices.target [Slice] CPUWeight=1000 MemoryMax=2G
La sección fundamental a la hora de definir el unit file es [Slice], en ella se establecen los límites de recursos que se aplicarán a los procesos a los que se le aplique. Los valores indicados en esa sección
- CPUWeight=1000: esta directiva, cuyo valor puede estar comprendido entre 1 y 10000, indica la asignación de CPU que tendrán todos los procesos a los que se aplique el slice. En este caso estamos asignando el 10% de la CPU de forma dedicada a los procesos afectados por el slice.
- MemoryMax=2G: esta directiva establece el límite máximo de memoria que podrán utilizar los procesos afectados por el slice, en este caso 2GB, por tanto no podrán, en conjunto, todos los procesos a los que se aplique el slice, consumir más que esa cantidad de memoria
Hay otras muchas más opciones y directivas para establecer limitaciones de recursos utilizando este mecanismo.
Aplicación del slice a un service
Ahora vamos a aplicar el slice anterior a un service, en este caso al service que regula la ejecución del servidor web nginx.
Si no está instalado el servicio lo instalamos con
apt install nginx
tras lo cual editamos su unit de tipo service mediante el comando
systemctl edit --full nginx.service
el comando anterior creará una copia del unit file nginx.service original, ubicado en /lib/systemd/system/nginx.service, en /etc/systemd/system/nginx.service. De este modo se aplica la versión editada, pero se mantiene la original por si es necesario recuperar el estado de definición original del service.
En la sección [Service] añadimos la línea
Slice=www.slice
Recargamos los unit files
systemctl daemon-reload
Reiniciamos el service afectado
systemctl restart nginx.service
Para comprobar que efectivamente se está aplicando la limitación de recursos ejecutamos
systemctl status nginx.service
Lo cual mostraría la siguiente salida
nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2017-12-05 18:57:29 CET; 5min ago Docs: man:nginx(8) Process: 1089 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid ( Process: 1095 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS Process: 1092 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status= Main PID: 1096 (nginx) Tasks: 3 (limit: 4915) CGroup: /www.slice/nginx.service ├─1096 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ├─1097 nginx: worker process └─1098 nginx: worker process
notar como en la captura anterior aparece la línea
Cgroup: /www.slice/nginx.service
la cual indica que el service nginx.service está siendo afectado por la restricción definida en www.slice.
NOTA
CGroups, Control Groups, es un sistema de gestión de recursos del kernel.
JavierFP 17:44 11 dec 2017 (CET)