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 :

[[email protected]]# 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

[[email protected]]# 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 
[[email protected]]#

Servicio de CPU malvado 2

[[email protected]]# 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 
[[email protected]]#

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).

[[email protected]]# yum install libcgroup 
Package libcgroup-0.41-11.el7.x86_64 already installed and latest version 
Nothing to do 
[[email protected]]#

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.

[[email protected]]# systemctl enable cgconfig 
Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service 
to /usr/lib/systemd/system/cgconfig.service. 
[[email protected]]# systemctl start cgconfig 
[[email protected]]# 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. 
[[email protected]]#