Administrador de Linux - Gestión de recursos con crgoups
cgroups o grupos de control son una característica del kernel de Linux que permite a un administrador asignar o limitar los recursos del sistema para servicios y también para agrupar.
Para enumerar los grupos de control activos en ejecución, podemos usar el siguiente comando ps :
[root@localhost]# ps xawf -eo pid,user,cgroup,args
8362 root - \_ [kworker/1:2]
1 root - /usr/lib/systemd/systemd --switched-
root --system -- deserialize 21
507 root 7:cpuacct,cpu:/system.slice /usr/lib/systemd/systemd-journald
527 root 7:cpuacct,cpu:/system.slice /usr/sbin/lvmetad -f
540 root 7:cpuacct,cpu:/system.slice /usr/lib/systemd/systemd-udevd
715 root 7:cpuacct,cpu:/system.slice /sbin/auditd -n
731 root 7:cpuacct,cpu:/system.slice \_ /sbin/audispd
734 root 7:cpuacct,cpu:/system.slice \_ /usr/sbin/sedispatch
737 polkitd 7:cpuacct,cpu:/system.slice /usr/lib/polkit-1/polkitd --no-debug
738 rtkit 6:memory:/system.slice/rtki /usr/libexec/rtkit-daemon
740 dbus 7:cpuacct,cpu:/system.slice /bin/dbus-daemon --system --
address=systemd: --nofork --nopidfile --systemd-activation
La gestión de recursos, a partir de CentOS 6.X, se ha redefinido con la implementación de systemd init . Al pensar en la gestión de recursos para los servicios, lo principal en lo que centrarse son los cgroups .cgroupshan avanzado con systemd tanto en funcionalidad como en simplicidad.
El objetivo de cgroups en la gestión de recursos es que ningún servicio pueda hacer que el sistema caiga en su totalidad. O ningún proceso de servicio individual (quizás un script PHP mal escrito) paralizará la funcionalidad del servidor al consumir demasiados recursos.
Los cgroups permiten el control de recursos de las unidades para los siguientes recursos:
CPU - Limite las tareas intensivas de la CPU que no son críticas como otras tareas menos intensivas
Memory - Limitar la cantidad de memoria que puede consumir un servicio
Disks - Limitar la E / S del disco
** Tiempo de CPU: **
Las tareas que necesitan menos prioridad de CPU pueden tener Slices de CPU configurados de forma personalizada.
Echemos un vistazo a los siguientes dos servicios, por ejemplo.
Servicio de CPU educado 1
[root@localhost]# systemctl cat polite.service
# /etc/systemd/system/polite.service
[Unit]
Description = Polite service limits CPU Slice and Memory
After=remote-fs.target nss-lookup.target
[Service]
MemoryLimit = 1M
ExecStart = /usr/bin/sha1sum /dev/zero
ExecStop = /bin/kill -WINCH ${MAINPID}
WantedBy=multi-user.target
# /etc/systemd/system/polite.service.d/50-CPUShares.conf
[Service]
CPUShares = 1024
[root@localhost]#
Servicio de CPU malvado 2
[root@localhost]# systemctl cat evil.service
# /etc/systemd/system/evil.service
[Unit]
Description = I Eat You CPU
After=remote-fs.target nss-lookup.target
[Service]
ExecStart = /usr/bin/md5sum /dev/zero
ExecStop = /bin/kill -WINCH ${MAINPID}
WantedBy=multi-user.target
# /etc/systemd/system/evil.service.d/50-CPUShares.conf
[Service]
CPUShares = 1024
[root@localhost]#
Establezcamos Polite Service usando una prioridad de CPU menor:
systemctl set-property polite.service CPUShares = 20
/system.slice/polite.service
1 70.5 124.0K - -
/system.slice/evil.service
1 99.5 304.0K - -
Como podemos ver, durante un período de tiempo de inactividad normal del sistema, ambos procesos no autorizados siguen utilizando ciclos de CPU. Sin embargo, el que está configurado para tener menos intervalos de tiempo está usando menos tiempo de CPU. Con esto en mente, podemos ver cómo el uso de un intervalo de tiempo menor permitiría que las tareas esenciales accedan mejor a los recursos del sistema.
Para establecer servicios para cada recurso, el método set-property define los siguientes parámetros:
systemctl set-property name parameter=value
Rebanadas de CPU | CPUShares |
Limite de memoria | Limite de memoria |
Límite de memoria blanda | MemorySoftLimit |
Peso del bloque IO | BlockIOWeight |
Límite de dispositivo de bloque (especificado en / volume / path)) | BlockIODeviceWeight |
Leer IO | BlockIOReadBandwidth |
E / S de escritura en disco | BlockIOReadBandwidth |
La mayoría de las veces, los servicios estarán limitados por el uso de la CPU , los límites de memoria y la E / S de lectura / escritura .
Después de cambiar cada uno, es necesario volver a cargar systemd y reiniciar el servicio -
systemctl set-property foo.service CPUShares = 250
systemctl daemon-reload
systemctl restart foo.service
Configurar CGroups en CentOS Linux
Para crear cgroups personalizados en CentOS Linux, primero debemos instalar los servicios y configurarlos.
Step 1 - Instale libcgroup (si aún no está instalado).
[root@localhost]# yum install libcgroup
Package libcgroup-0.41-11.el7.x86_64 already installed and latest version
Nothing to do
[root@localhost]#
Como podemos ver, por defecto CentOS 7 tiene libcgroup instalado con el instalador de Everything . El uso de un instalador mínimo requerirá que instalemos las utilidades libcgroup junto con las dependencias.
Step 2 - Inicie y habilite el servicio cgconfig.
[root@localhost]# systemctl enable cgconfig
Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service
to /usr/lib/systemd/system/cgconfig.service.
[root@localhost]# systemctl start cgconfig
[root@localhost]# systemctl status cgconfig
● cgconfig.service - Control Group configuration service
Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor
preset: disabled)
Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago
Main PID: 4692 (code=exited, status = 0/SUCCESS)
Memory: 0B
CGroup: /system.slice/cgconfig.service
Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group
configuration service...
Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group
configuration service.
[root@localhost]#