GNU/Linux >> Tutoriales Linux >  >> Linux

Administrar recursos con cgroups en systemd

Hay pocas cosas más frustrantes para mí como administrador de sistemas que quedarme sin un recurso informático de forma inesperada. En más de una ocasión, llené todo el espacio disponible en el disco en una partición, me quedé sin RAM y no tuve suficiente tiempo de CPU para realizar mis tareas en un tiempo razonable. La administración de recursos es una de las tareas más importantes que realizan los administradores de sistemas.

El objetivo de la gestión de recursos es garantizar que todos los procesos tengan un acceso relativamente equitativo a los recursos del sistema que necesitan. La administración de recursos también implica garantizar que la memoria RAM, el espacio en el disco duro y la capacidad de la CPU se agreguen cuando sea necesario o se racionen cuando eso no sea posible. Además, se debe evitar que los usuarios que acaparan los recursos del sistema, ya sea de forma intencionada o accidental, lo hagan.

Existen herramientas que permiten a los administradores de sistemas monitorear y administrar varios recursos del sistema. Por ejemplo, las herramientas principales y similares le permiten monitorear el uso de la memoria, E/S, almacenamiento (disco, SSD, etc.), red, espacio de intercambio, uso de la CPU y más. Estas herramientas, particularmente aquellas que están centradas en la CPU, se basan principalmente en el paradigma de que el proceso en ejecución es la unidad de control. En el mejor de los casos, proporcionan una forma de ajustar el número agradable, y a través de eso, la prioridad, o de eliminar un proceso en ejecución. (Para obtener información sobre buenos números, consulte Monitoreo de hosts Linux y Windows con Glances .)

Más sobre administradores de sistemas

  • Habilitar el blog de administrador del sistema
  • La empresa automatizada:una guía para administrar TI con automatización
  • Libro electrónico:Automatización de Ansible para administradores de sistemas
  • Historias del campo:una guía del administrador de sistemas para la automatización de TI
  • eBook:Una guía de Kubernetes para SRE y administradores de sistemas
  • Últimos artículos de administrador de sistemas

Otras herramientas basadas en la gestión tradicional de recursos en un entorno SystemV son gestionadas por /etc/security/limits.conf y los archivos de configuración locales ubicados en /etc/security/limits.d directorio. Los recursos se pueden limitar de una manera bastante tosca pero útil por usuario o grupo. Los recursos que se pueden administrar incluyen varios aspectos de RAM, tiempo total de CPU por día, cantidad total de datos, prioridad, buena cantidad, cantidad de inicios de sesión simultáneos, cantidad de procesos, tamaño máximo de archivo y más.

Uso de cgroups para la gestión de procesos

Una diferencia importante entre systemd y SystemV es cómo manejan los procesos. SystemV trata cada proceso como una entidad en sí mismo. systemd recopila procesos relacionados en grupos de control, llamados cgroups (abreviatura de grupos de control), y administra los recursos del sistema para cgroup como un todo. Esto significa que los recursos se pueden administrar por aplicación en lugar de por los procesos individuales que componen una aplicación.

Las unidades de control para cgroups se denominan unidades de corte. Los segmentos son una conceptualización que permite a systemd ordenar los procesos en un formato de árbol para facilitar la administración.

Visualización de cgroups

Comenzaré con algunos comandos que le permiten ver varios tipos de información sobre cgroups. El systemctl status <service> El comando muestra información de segmento sobre un servicio específico, incluido su segmento. Este ejemplo muestra el at demonio:

[root@testvm1 ~]# systemctl status atd.service
● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-09-23 12:18:24 EDT; 1 day 3h ago
       Docs: man:atd(8)
   Main PID: 1010 (atd)
      Tasks: 1 (limit: 14760)
     Memory: 440.0K
        CPU: 5ms
     CGroup: /system.slice/atd.service
             └─1010 /usr/sbin/atd -f

Sep 23 12:18:24 testvm1.both.org systemd[1]: Started Deferred execution scheduler.
[root@testvm1 ~]#

Este es un excelente ejemplo de una de las razones por las que systemd es más útil que SystemV y el antiguo programa init. Hay mucha más información aquí de la que SystemV podría proporcionar. La entrada cgroup incluye la estructura jerárquica donde system.slice es systemd (PID 1), y el atd.service está un nivel por debajo y forma parte del system.slice . La segunda línea de la entrada de cgroup también muestra el ID del proceso (PID) y el comando utilizado para iniciar el daemon.

El systemctl El comando muestra varias entradas de cgroup. El --all La opción muestra todos los cortes, incluidos los que no están activos actualmente:

[root@testvm1 ~]# systemctl -t slice --all
  UNIT                             LOAD   ACTIVE   SUB    DESCRIPTION                    
  -.slice                          loaded active   active Root Slice                      
  system-getty.slice               loaded active   active system-getty.slice              
  system-lvm2\x2dpvscan.slice      loaded active   active system-lvm2\x2dpvscan.slice    
  system-modprobe.slice            loaded active   active system-modprobe.slice          
  system-sshd\x2dkeygen.slice      loaded active   active system-sshd\x2dkeygen.slice    
  system-systemd\x2dcoredump.slice loaded inactive dead   system-systemd\x2dcoredump.slice
  system-systemd\x2dfsck.slice     loaded active   active system-systemd\x2dfsck.slice    
  system.slice                     loaded active   active System Slice                    
  user-0.slice                     loaded active   active User Slice of UID 0            
  user-1000.slice                  loaded active   active User Slice of UID 1000          
  user.slice                       loaded active   active User and Session Slice          

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

11 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
[root@testvm1 ~]#

Lo primero que debe notar acerca de estos datos es que muestra segmentos de usuario para los UID 0 (raíz) y 1000, que es mi inicio de sesión de usuario. Esto muestra solo los segmentos y no los servicios que forman parte de cada segmento. Estos datos muestran que se crea un segmento para cada usuario en el momento en que inician sesión. Esto puede proporcionar una forma de administrar todas las tareas de un usuario como una sola entidad de cgroup.

Explore la jerarquía de cgroup

Todo va muy bien hasta ahora, pero los cgroups son jerárquicos y todas las unidades de servicio se ejecutan como miembros de uno de los cgroups. Ver esa jerarquía es fácil y usa un comando antiguo y uno nuevo que es parte de systemd.

El ps El comando se puede usar para mapear los procesos y sus ubicaciones en la jerarquía de cgroup. Tenga en cuenta que es necesario especificar las columnas de datos deseadas al usar el ps dominio. Reduje significativamente el volumen de salida de este comando a continuación, pero traté de dejar lo suficiente para que pueda tener una idea de lo que puede encontrar en sus sistemas:

[root@testvm1 ~]# ps xawf -eo pid,user,cgroup,args
    PID USER     CGROUP                      COMMAND
      2 root     -                           [kthreadd]
      3 root     -                            \_ [rcu_gp]
      4 root     -                            \_ [rcu_par_gp]
      6 root     -                            \_ [kworker/0:0H-kblockd]
      9 root     -                            \_ [mm_percpu_wq]
     10 root     -                            \_ [ksoftirqd/0]
     11 root     -                            \_ [rcu_sched]
     12 root     -                            \_ [migration/0]
     13 root     -                            \_ [cpuhp/0]
     14 root     -                            \_ [cpuhp/1]
<SNIP>
 625406 root     -                            \_ [kworker/3:0-ata_sff]
 625409 root     -                            \_ [kworker/u8:0-events_unbound]
      1 root     0::/init.scope              /usr/lib/systemd/systemd --switched-root --system --deserialize 30
    588 root     0::/system.slice/systemd-jo /usr/lib/systemd/systemd-journald
    599 root     0::/system.slice/systemd-ud /usr/lib/systemd/systemd-udevd
    741 root     0::/system.slice/auditd.ser /sbin/auditd
    743 root     0::/system.slice/auditd.ser  \_ /usr/sbin/sedispatch
    764 root     0::/system.slice/ModemManag /usr/sbin/ModemManager
    765 root     0::/system.slice/NetworkMan /usr/sbin/NetworkManager --no-daemon
    767 root     0::/system.slice/irqbalance /usr/sbin/irqbalance --foreground
    779 root     0::/system.slice/mcelog.ser /usr/sbin/mcelog --ignorenodev --daemon --foreground
    781 root     0::/system.slice/rngd.servi /sbin/rngd -f
    782 root     0::/system.slice/rsyslog.se /usr/sbin/rsyslogd -n
<SNIP>
    893 root     0::/system.slice/sshd.servi sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
   1130 root     0::/user.slice/user-0.slice  \_ sshd: root [priv]
   1147 root     0::/user.slice/user-0.slice  |   \_ sshd: root@pts/0
   1148 root     0::/user.slice/user-0.slice  |       \_ -bash
   1321 root     0::/user.slice/user-0.slice  |           \_ screen
   1322 root     0::/user.slice/user-0.slice  |               \_ SCREEN
   1323 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 498801 root     0::/user.slice/user-0.slice  |                   |   \_ man systemd.resource-control
 498813 root     0::/user.slice/user-0.slice  |                   |       \_ less
   1351 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 123293 root     0::/user.slice/user-0.slice  |                   |   \_ man systemd.slice
 123305 root     0::/user.slice/user-0.slice  |                   |       \_ less
   1380 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 625412 root     0::/user.slice/user-0.slice  |                   |   \_ ps xawf -eo pid,user,cgroup,args
 625413 root     0::/user.slice/user-0.slice  |                   |   \_ less
 246795 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 625338 root     0::/user.slice/user-0.slice  |                       \_ /usr/bin/mc -P /var/tmp/mc-root/mc.pwd.246795
 625340 root     0::/user.slice/user-0.slice  |                           \_ bash -rcfile .bashrc
   1218 root     0::/user.slice/user-1000.sl  \_ sshd: dboth [priv]
   1233 dboth    0::/user.slice/user-1000.sl      \_ sshd: dboth@pts/1
   1235 dboth    0::/user.slice/user-1000.sl          \_ -bash
<SNIP>
   1010 root     0::/system.slice/atd.servic /usr/sbin/atd -f
   1011 root     0::/system.slice/crond.serv /usr/sbin/crond -n
   1098 root     0::/system.slice/lxdm.servi /usr/sbin/lxdm-binary
   1106 root     0::/system.slice/lxdm.servi  \_ /usr/libexec/Xorg -background none :0 vt01 -nolisten tcp -novtswitch -auth /var/run/lxdm/lxdm-:0.auth
 370621 root     0::/user.slice/user-1000.sl  \_ /usr/libexec/lxdm-session
 370631 dboth    0::/user.slice/user-1000.sl      \_ xfce4-session
 370841 dboth    0::/user.slice/user-1000.sl          \_ /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4"
 370911 dboth    0::/user.slice/user-1000.sl          \_ xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2
 370930 dboth    0::/user.slice/user-1000.sl          \_ xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952
 370942 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libsystray.so 6 23068680 systr
ay Notification Area Area where notification icons appear
 370943 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libpulseaudio-plugin.so 8 2306
8681 pulseaudio PulseAudio Plugin Adjust the audio volume of the PulseAudio sound system
 370944 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libxfce4powermanager.so 9 2306
8682 power-manager-plugin Power Manager Plugin Display the battery levels of your devices and control the brightness of your display
 370945 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libnotification-plugin.so 10 2
3068683 notification-plugin Notification Plugin Notification plugin for the Xfce panel
 370948 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libactions.so 14 23068684 acti
ons Action Buttons Log out, lock or other system actions
 370934 dboth    0::/user.slice/user-1000.sl          \_ Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon
 370939 dboth    0::/user.slice/user-1000.sl          \_ xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324
 370962 dboth    0::/user.slice/user-1000.sl          \_ nm-applet
<SNIP>

Puede ver toda la jerarquía con systemd-cgls comando, que es un poco más simple porque no requiere ninguna opción compleja.

He acortado considerablemente esta vista de árbol. también, pero dejé suficiente para darle una idea de la cantidad de datos, así como los tipos de entradas que debería ver cuando hace esto en su sistema. Hice esto en una de mis máquinas virtuales y tiene unas 200 líneas; la cantidad de datos de mi estación de trabajo principal es de unas 250 líneas:

[root@testvm1 ~]# systemd-cgls
Control group /:
-.slice
├─user.slice
│ ├─user-0.slice
│ │ ├─session-1.scope
│ │ │ ├─  1130 sshd: root [priv]
│ │ │ ├─  1147 sshd: root@pts/0
│ │ │ ├─  1148 -bash
│ │ │ ├─  1321 screen
│ │ │ ├─  1322 SCREEN
│ │ │ ├─  1323 /bin/bash
│ │ │ ├─  1351 /bin/bash
│ │ │ ├─  1380 /bin/bash
│ │ │ ├─123293 man systemd.slice
│ │ │ ├─123305 less
│ │ │ ├─246795 /bin/bash
│ │ │ ├─371371 man systemd-cgls
│ │ │ ├─371383 less
│ │ │ ├─371469 systemd-cgls
│ │ │ └─371470 less
│ │ └─[email protected]
│ │   ├─dbus-broker.service
│ │   │ ├─1170 /usr/bin/dbus-broker-launch --scope user
│ │   │ └─1171 dbus-broker --log 4 --controller 12 --machine-id 3bccd1140fca488187f8a1439c832f07 --max-bytes 100000000000000 --max-fds 25000000000000 --max->
│ │   ├─gvfs-daemon.service
│ │   │ └─1173 /usr/libexec/gvfsd
│ │   └─init.scope
│ │     ├─1137 /usr/lib/systemd/systemd --user
│ │     └─1138 (sd-pam)
│ └─user-1000.slice
│   ├─[email protected]
│   │ ├─dbus\x2d:1.2\x2dorg.xfce.Xfconf.slice
│   │ │ └─dbus-:[email protected]
│   │ │   └─370748 /usr/lib64/xfce4/xfconf/xfconfd
│   │ ├─dbus\x2d:1.2\x2dca.desrt.dconf.slice
│   │ │ └─dbus-:[email protected]
│   │ │   └─371262 /usr/libexec/dconf-service
│   │ ├─dbus-broker.service
│   │ │ ├─1260 /usr/bin/dbus-broker-launch --scope user
│   │ │ └─1261 dbus-broker --log 4 --controller 11 --machine-id
<SNIP>
│   │ └─gvfs-mtp-volume-monitor.service
│   │   └─370987 /usr/libexec/gvfs-mtp-volume-monitor
│   ├─session-3.scope
│   │ ├─1218 sshd: dboth [priv]
│   │ ├─1233 sshd: dboth@pts/1
│   │ └─1235 -bash
│   └─session-7.scope
│     ├─370621 /usr/libexec/lxdm-session
│     ├─370631 xfce4-session
│     ├─370805 /usr/bin/VBoxClient --clipboard
│     ├─370806 /usr/bin/VBoxClient --clipboard
│     ├─370817 /usr/bin/VBoxClient --seamless
│     ├─370818 /usr/bin/VBoxClient --seamless
│     ├─370824 /usr/bin/VBoxClient --draganddrop
│     ├─370825 /usr/bin/VBoxClient --draganddrop
│     ├─370841 /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4"
│     ├─370910 /bin/gpg-agent --sh --daemon --write-env-file /home/dboth/.cache/gpg-agent-info
│     ├─370911 xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2
│     ├─370923 xfsettingsd --display :0.0 --sm-client-id 261b4a437-3029-461c-9551-68c2c42f4fef
│     ├─370930 xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952
│     ├─370934 Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon
│     ├─370939 xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324
<SNIP>
└─system.slice
  ├─rngd.service
  │ └─1650 /sbin/rngd -f
  ├─irqbalance.service
  │ └─1631 /usr/sbin/irqbalance --foreground
  ├─fprintd.service
  │ └─303383 /usr/libexec/fprintd
  ├─systemd-udevd.service
  │ └─956 /usr/lib/systemd/systemd-udevd
<SNIP>
  ├─systemd-journald.service
  │ └─588 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1010 /usr/sbin/atd -f
  ├─system-dbus\x2d:1.10\x2dorg.freedesktop.problems.slice
  │ └─dbus-:[email protected]
  │   └─371197 /usr/sbin/abrt-dbus -t133
  ├─sshd.service
  │ └─893 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
  ├─vboxservice.service
  │ └─802 /usr/sbin/VBoxService -f
  ├─crond.service
  │ └─1011 /usr/sbin/crond -n
  ├─NetworkManager.service
  │ └─765 /usr/sbin/NetworkManager --no-daemon
  ├─switcheroo-control.service
  │ └─787 /usr/libexec/switcheroo-control
 <SNIP>

Esta vista de árbol muestra todos los segmentos de usuarios y sistemas y los servicios y programas que se ejecutan en cada cgroup. Observe las unidades denominadas "ámbitos", que agrupan programas relacionados en una unidad de gestión, dentro del user-1000.slice en el listado de arriba. El user-1000.slice/session-7.scope cgroup contiene la jerarquía del programa de escritorio GUI, comenzando con la sesión del administrador de pantalla LXDM y todas sus subtareas, incluidas cosas como el shell Bash y el administrador de archivos GUI Thunar.

Las unidades de alcance no se definen en los archivos de configuración, sino que se generan mediante programación como resultado de iniciar grupos de programas relacionados. Las unidades de alcance no crean ni inician los procesos que se ejecutan como parte de ese cgroup. Todos los procesos dentro del alcance son iguales y no existe una jerarquía interna. La vida de un ámbito comienza cuando se crea el primer proceso y finaliza cuando se destruye el último proceso.

Abra varias ventanas en su escritorio, como emuladores de terminal, LibreOffice o lo que desee, luego cambie a una consola virtual disponible e inicie algo como top o Comandante de medianoche. Ejecute el systemd-cgls comando en su host y tome nota de la jerarquía general y las unidades de alcance.

El systemd-cgls El comando proporciona una representación más completa de la jerarquía de cgroup (y los detalles de las unidades que la componen) que cualquier otro comando que haya encontrado. Prefiero su representación más limpia del árbol que lo que ps proporciona el comando.

Con un poco de ayuda de mis amigos

Después de cubrir estos conceptos básicos, había planeado entrar en más detalles sobre cgroups y cómo usarlos, pero descubrí una serie de cuatro excelentes artículos de Steve Ovens de Red Hat en el sitio hermano de Opensource.com, Enable Sysadmin. En lugar de reescribir básicamente los artículos de Steve, decidí que sería mucho mejor aprovechar su experiencia en cgroup al vincularlos:

  1. Introducción de un administrador de sistemas de Linux a cgroups
  2. Cómo administrar cgroups con CPUShares
  3. Gestionar cgroups de la forma más difícil:manualmente
  4. Administrar cgroups con systemd

Disfruta y aprende de ellos, como hice yo.

Otros recursos

Hay una gran cantidad de información sobre systemd disponible en Internet, pero mucha es concisa, obtusa o incluso engañosa. Además de los recursos mencionados en este artículo, las siguientes páginas web ofrecen información más detallada y confiable sobre el inicio de systemd. Esta lista ha crecido desde que comencé esta serie de artículos para reflejar la investigación que he realizado.

  • El Proyecto Fedora tiene una buena guía práctica para systemd. Tiene prácticamente todo lo que necesita saber para configurar, administrar y mantener una computadora Fedora usando systemd.
  • El Proyecto Fedora también tiene una buena hoja de trucos que hace una referencia cruzada de los comandos antiguos de SystemV con los de systemd comparables.
  • La página del manual systemd.unit(5) contiene una buena lista de secciones de archivos de unidades y sus opciones de configuración junto con descripciones concisas de cada una.
  • La documentación de Red Hat contiene una buena descripción de la estructura de archivos de la unidad, así como otra información importante.
  • Para obtener información técnica detallada sobre systemd y las razones para crearlo, consulte la descripción de systemd de Freedesktop.org. Esta página es una de las mejores que he encontrado porque contiene muchos enlaces a otra documentación importante y precisa.
  • "More systemd fun" de Linux.com ofrece información y consejos más avanzados sobre systemd.
  • Consulte la página man de systemd.resource-control(5).
  • En La guía del administrador y del usuario del kernel de Linux , consulte la entrada Control Group v2.

También hay una serie de artículos profundamente técnicos para administradores de sistemas Linux escritos por Lennart Poettering, el diseñador y desarrollador principal de systemd. Estos artículos fueron escritos entre abril de 2010 y septiembre de 2011, pero son tan relevantes ahora como lo fueron entonces. Gran parte de todo lo bueno que se ha escrito sobre systemd y su ecosistema se basa en estos documentos.

  • Repensar el PID 1
  • systemd para administradores, Parte I
  • systemd para administradores, Parte II
  • systemd para administradores, Parte III
  • systemd para administradores, Parte IV
  • systemd para administradores, Parte V
  • systemd para administradores, Parte VI
  • systemd para administradores, Parte VII
  • systemd para administradores, Parte VIII
  • systemd para administradores, Parte IX
  • systemd para administradores, Parte X
  • systemd para administradores, Parte XI

Linux
  1. Administrar su hardware adjunto en Linux con systemd-udevd

  2. Administrar particiones en Linux con fdisk

  3. ¿Arranque no gráfico con Systemd?

  4. Systemd con múltiples execStart

  5. Unidades USB de montaje automático con systemd

Cómo automatizar sus recursos de AWS con plantillas de CloudFormation

Ordenar la gestión de procesos con ps o systemd

Administrar cgroups de la manera difícil:manualmente

Cómo administrar cgroups con CPUShares

Administrar cgroups con systemd

Administrar registros con Logrotate en Ubuntu