Principios del sistema operativo Linux: gestión y limitación de recursos del proceso cgroups

Tabla de contenido

cgroups

Cgroups (grupos de control) es un mecanismo proporcionado por el Kernel de Linux que puede limitar los recursos utilizados por un solo proceso o varios procesos. Puede lograr un control detallado de recursos como CPU, memoria, E / S, etc. La tecnología de contenedor ligero Docker Las capacidades de restricción de recursos proporcionadas por cgroups se utilizan para completar el control de recursos a nivel del sistema operativo y luego para realizar la virtualización del sistema operativo.

Subsistema de cgroups

cgroups define un subsistema para cada recurso que se puede controlar. Los subsistemas típicos son los siguientes:

  • subsistema cpu : restringe principalmente el uso de CPU del proceso.
  • Subsistema cpuacct : Puede contar el informe de uso de CPU de los procesos en cgroups.
  • Subsistema cpuset : puede asignar CPU o nodos de memoria separados para procesos en cgroups.
  • Subsistema de memoria : puede limitar el uso de memoria del proceso.
  • Subsistema de dispositivos : puede controlar el proceso para poder acceder a ciertos dispositivos.
  • Subsistema blkio : puede limitar la E / S del dispositivo de bloque del proceso.
  • Subsistema net_cls : puede marcar los paquetes de datos de red de los procesos en cgroups, y luego puede usar el módulo tc (control de tráfico) para controlar los paquetes de datos.
  • Subsistema Freezer : puede suspender o reanudar procesos en cgroups.
  • Subsistema ns : Puede hacer que los procesos de diferentes cgroups utilicen diferentes espacios de nombres.

Tenga en cuenta que cada subsistema necesita cooperar con otros módulos del Kernel para completar el control de recursos, como:

  • Los recursos de la CPU están restringidos por el módulo de programación de procesos para completar la configuración de acuerdo con los subsistemas de la CPU;
  • El límite de recursos de memoria son los módulos de memoria de acuerdo con la configuración del subsistema de memoria para completar.
  • El control de los paquetes de datos de la red requiere que el módulo de control de tráfico se complete de acuerdo con la configuración del subsistema net_cls.

La jerarquía de cgroups

El kernel usa cgroup Struct (estructura) para representar el límite de recursos de un grupo de control para varios subsistemas de cgroups.

Cgroup Struct se puede organizar en un árbol, llamado jerarquía cgroups (jerarquía), cada jerarquía cgroups puede adjuntar varios subsistemas cgroups y la jerarquía cgroups puede limitar los recursos de los subsistemas cgroups adjuntos. Cada subsistema de cgroups solo se puede adjuntar a una jerarquía de cgroups.

Inserte la descripción de la imagen aquí

En las jerarquías cgroups A y B de la figura anterior, cada jerarquía es una estructura de árbol y cada nodo del árbol es una estructura cgroup, como: cpu_cgrp, memory_cgrp.

  1. Jerarquía cgroups A: Adjunte el subsistema cpu y el subsistema cpuacct La estructura cgroup en la jerarquía cgroups actual puede limitar los recursos de la CPU y contar el uso de la CPU del proceso.
  2. Jerarquía B de cgroups: Adjunte el subsistema de memoria La estructura cgroup en la Jerarquía de cgroups actual puede limitar los recursos de la memoria.

Y, en cada jerarquía de cgroups, cada nodo (estructura de cgroup) puede establecer diferentes pesos de restricción para los recursos. Como se muestra en la figura anterior, los procesos del grupo cgrp1 pueden utilizar el 60% del intervalo de tiempo de la CPU y los procesos del grupo cgrp2 pueden utilizar el 20% del intervalo de tiempo de la CPU.

cgroups y procesos

Como se mencionó anteriormente, el kernel de Linux usa el subsistema cgroups para limitar los recursos del sistema, y ​​también se menciona que el subsistema cgroups debe estar adjunto a la jerarquía cgroups para controlar los recursos del proceso. Entonces, ¿cómo asocia Kernel el procesador con la jerarquía de cgroups?

Una vez creado el nodo (cgroup Struct) en la jerarquía cgroups, el procesador se puede agregar a la lista de tareas de control de un nodo. Todos los procesadores en la lista de control de un nodo estarán restringidos por los recursos del nodo actual. Al mismo tiempo, también se puede agregar un procesador a los nodos de diferentes jerarquías de cgroups, porque diferentes jerarquías de cgroups pueden ser responsables de diferentes recursos del sistema.

Por tanto, Processor y cgroup Struct están en una relación de muchos a muchos, lo que significa que diferentes procesadores están controlados por diferentes cgroup Structs y, por lo tanto, tienen diferentes restricciones de recursos.

Inserte la descripción de la imagen aquí

La figura anterior describe la relación entre procesos y cgroups. P representa un proceso. Un puntero en el descriptor de cada proceso apunta a una estructura de datos css_set (conjunto de subsistemas cgroups), y un proceso que apunta a un css_set se agregará a la lista de procesos css_set. Un proceso solo puede pertenecer a un css_set, y un css_set puede contener varios procesos.Los procesos que pertenecen al mismo css_set están sujetos a las restricciones de recursos asociadas con css_set.

Entre ellos, M × N Linkage significa que css_set puede tener una asociación de muchos a muchos con cgroup Struct. Pero la implementación de cgroups no permite que css_set asocie múltiples estructuras cgroup bajo la misma jerarquía cgroups al mismo tiempo. Esto se debe a que los cgroups no permiten múltiples configuraciones de restricción para el mismo recurso. Cuando un css_set está asociado con múltiples nodos de jerarquía de cgroups, indica que es necesario controlar múltiples recursos de los procesos bajo el css_set actual. Cuando un nodo cgroups está asociado con múltiples css_sets, indica que las listas de procesos bajo múltiples css_sets están sujetas a las mismas restricciones del mismo recurso.

cgroups y sistema de archivos

Linux usa una variedad de estructuras de datos para implementar la configuración de cgroups en el kernel, asociando Processor y cgroup Struct, entonces, ¿cómo permite Linux que los procesos en modo de usuario usen las funciones de cgroups?

El sistema de archivos de Linux se implementa como VFS (sistema de archivos virtual). VFS puede ocultar los detalles de diferentes tipos de proveedores de sistemas de archivos en la parte inferior y proporcionar una interfaz API de sistema de archivos unificada para procesos en modo de usuario. Cgroups también expone funciones al modo de usuario a través de VFS. La conexión entre cgroups y VFS se llama cgroups File System.

Los sistemas de archivos implementados basados ​​en VFS deben implementar los objetos definidos por el modelo de archivos general de VFS, al igual que el sistema de archivos de cgroups. Al implementar el modelo de sistema de archivos general de VFS, cgroups oculta los detalles del mantenimiento de la jerarquía de cgroups en estas funciones de implementación del sistema de archivos de cgroups. .

Uso de cgroups

Montar el sistema de archivos cgroups

Antes de usar cgroups, primero debe montar el sistema de archivos cgroups, comando:

mount -t cgroup -o subsystems name /cgroup/name
  • subsystems indica los subsistemas de cgroups que deben montarse.
  • / cgroup / name representa el punto de montaje.

Como se mencionó anteriormente, este comando crea una jerarquía cgroups en el kernel.

Por ejemplo, si monta los cuatro subsistemas cgroups de cpuset, cpu, cpuacct y la memoria en el directorio / cgroup / cpu_and_mem, ejecute:

mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem

En CentOS, después de yum install libcgroupinstalar el módulo cgroups, el punto de montaje del subsistema cgroups se genera automáticamente en el archivo de configuración /etc/cgconfig.conf:

mount {
    cpuset  = /cgroup/cpuset;
    cpu = /cgroup/cpu;
    cpuacct = /cgroup/cpuacct;
    memory  = /cgroup/memory;
    devices = /cgroup/devices;
    freezer = /cgroup/freezer;
    net_cls = /cgroup/net_cls;
    blkio   = /cgroup/blkio;
}

Cada configuración anterior es equivalente al comando de montaje expandido.

Crear nodos secundarios

Después de montar un subsistema cgroups en el punto de montaje, puede crear un nodo (cgroup Struct) en la jerarquía cgroups creando una carpeta debajo del punto de montaje o usando el comando cgcreate. Por ejemplo, a través del comando:

cgcreate -t sankuai:sankuai -g cpu:test

Puede crear una prueba denominada cgroup Struct en el subsistema cpu. El resultado es el siguiente:

$ ls
cgroup.event_control  cgroup.procs  cpu.cfs_period_us  cpu.cfs_quota_us  cpu.rt_period_us   cpu.rt_runtime_us  cpu.shares  cpu.stat  lxc  notify_on_release  release_agent  tasks  test

Luego, puede configurar los recursos que deben restringirse escribiendo los valores requeridos en diferentes archivos bajo prueba. Se puede realizar una variedad de configuraciones diferentes en cada subsistema, y ​​los parámetros que deben configurarse son diferentes. Para configuraciones detalladas de parámetros, consulte el manual man cgroups. Por ejemplo: el uso del comando cgset también puede configurar los parámetros del subsistema cgroups, el comando es:

cgset -r parameter=value path_to_cgroup

Cuando necesite eliminar un nodo cgroups, puede usar el comando cgdelete. Por ejemplo, para eliminar el nodo de prueba anterior, puede usar el comando:

cgdelete -r cpu:test

Agregar proceso al nodo hijo

También hay muchas formas de agregar un proceso a un nodo hijo de cgroups. Puede escribir el pid directamente en el archivo de tareas bajo el nodo hijo. También puede agregar un proceso a través de cgclassify, la instrucción es:

cgclassify -g subsystems:path_to_cgroup pidlist

También puede usar cgexec directamente para iniciar un proceso en ciertos grupos de c, el comando es:

gexec -g subsystems:path_to_cgroup command arguments

Supongo que te gusta

Origin blog.csdn.net/Jmilk/article/details/108894380
Recomendado
Clasificación