GNU/Linux >> Tutoriales Linux >  >> Linux

Limite la memoria y la CPU con lxc-execute

En primer lugar, me gustaría que comprendiera los Cgroups que forman parte de la utilidad LXC. cuando tiene un contenedor, obviamente querrá asegurarse de que los diversos contenedores que tiene en ejecución hagan morir de hambre a cualquier otro contenedor o proceso dentro. Con esto en mente, el buen tipo del proyecto LXC, también conocido como Daniel Lezcano, integró cgroups con la tecnología de contenedores que estaba creando, es decir, LXC. Ahora, si desea asignar el uso de recursos, deberá considerar la configuración de su CGROUP. Los Cgroups le permiten asignar recursos, como tiempo de CPU, memoria del sistema, ancho de banda de la red o combinaciones de estos recursos, entre grupos de tareas definidos por el usuario. (procesos) que se ejecutan en un sistema. Puede monitorear los cgroups que configura, denegar el acceso de cgroups a ciertos recursos e incluso reconfigurar sus cgroups dinámicamente en un sistema en ejecución. El servicio cgconfig (configuración del grupo de control) se puede configurar para que se inicie en el momento del arranque y restablezca sus cgroups predefinidos, lo que los hace persistentes en los reinicios. Los cgroups pueden tener múltiples jerarquías porque cada jerarquía está adjunta a uno o más subsistemas (también conocidos como recursos). controladores o controladores). Esto creará varios árboles que no están conectados. Hay nueve subsistemas disponibles.

  1. blkio establece límites en el acceso de entrada/salida en dispositivos de bloque
  2. programador de cpu para el acceso de tareas de cgroup a la CPU
  3. cpuacct genera informes para uso de CPU y cgroup
  4. cpuset asigna CPU y memoria a un cgroup
  5. los dispositivos administran el acceso a los dispositivos por tareas
  6. suspender/reanudar tareas del congelador
  7. memoria límite de memoria
  8. net_cls etiqueta paquetes de red para permitir que el controlador de tráfico de Linux identifique el tráfico de tareas
  9. espacio de nombres ns

Podemos listar los subsistemas que tenemos en nuestro núcleo con el comando:

lssubsys –am

lxc-cgroup obtiene o establece el valor del grupo de control asociado con el nombre del contenedor. Administre el grupo de control asociado con un contenedor. Ejemplo de uso:

lxc-cgroup -n foo cpuset.cpus "0,3" 

asigne los procesadores 0 y 3 al contenedor.

Ahora, en mi opinión, he respondido a su pregunta original. Pero permítame agregar algunos parámetros que podrían serle útiles para configurar su contenedor para usar lxc. hay forma condensada de la documentación de control de recursos por redhat

Parámetros modificables de BLKIO:

    blkio.reset_stats : any int to reset the statistics of BLKIO
    blkio.weight : 100 - 1000 (relative proportion of block I/O access)
    blkio.weight_device : major, minor , weight 100 - 1000 
    blkio.time : major, minor and time (device type and node numbers and length of access in milli seconds)
    blkio.throttle.read_bps_device : major, minor specifies the upper limit on the number of read operations a device can perform. The rate of the read operations is specified in bytes per second.
    blkio.throttle.read_iops_device :major, minor and operations_per_second specifies the upper limit on the number of read operations a device can  perform
    blkio.throttle.write_bps_device : major, minor and bytes_per_second (bytes per second)
    blkio.throttle.write_iops_device : major, minor and operations_per_second

Parámetros modificables de CFS:

    cpu.cfs_period_us : specifies a period of time in microseconds for how regularly a cgroup's access to CPU resources should be reallocated. If tasks in a cgroup should be able to access a single CPU for 0.2 seconds out of every 1 second, set cpu.cfs_quota_us to 200000 and cpu.cfs_period_us to 1000000.
    cpu.cfs_quota_us : total amount of time in microseconds that all tasks in a cgroup can run during one period. Once limit has reached, they are not allowed to run beyond that. 
    cpu.shares : contains an integer value that specifies the relative share of CPU time available to tasks in a cgroup.


    Note: For example, tasks in two cgroups that have cpu.shares set to 1 will receive equal CPU time, but tasks in a cgroup that has cpu.shares set to 2 receive twice the CPU time of tasks in a cgroup where cpu.shares is set to 1. Note that shares of CPU time are distributed per CPU. If one cgroup is limited to 25% of CPU and another cgroup is limited to 75% of CPU, on a multi-core system, both cgroups will use 100% of two different CPUs. 

Parámetros modificables de RT:

cpu.rt_period_us : time in microseconds for how regularly a cgroups access to CPU resources should be reallocated. 
cpu.rt_runtime_us : same as above.

Conjunto de CPU:

cpuset subsystem assigns individual CPUs and memory nodes to cgroups.
Note: here some parameters are mandatory
Mandatory: 


cpuset.cpus : specifies the CPUs that tasks in this cgroup are permitted to access. This is a comma-separated list in ASCII format, with dashes (" -")                 to represent ranges. For example 0-2,16 represents CPUs 0, 1, 2, and 16. 
        cpuset.mems : specifies the memory nodes that tasks in this cgroup are permitted to access. same as above format


Optional: 
        cpuset.cpu_exclusive : contains a flag ( 0 or 1) that specifies whether cpusets other than this one and its parents and children can share the CPUs specified for this cpuset. By default ( 0), CPUs are not allocated exclusively to one cpuset. 
        cpuset.mem_exclusive : contains a flag ( 0 or 1) that specifies whether other cpusets can share the memory nodes specified for this cpuset. By default ( 0), memory nodes are not allocated exclusively to one cpuset. Reserving memory nodes for the exclusive use of a cpuset ( 1) is functionally the same as enabling a memory hardwall with the cpuset.mem_hardwall parameter.
        cpuset.mem_hardwall : contains a flag ( 0 or 1) that specifies whether kernel allocations of memory page and buffer data should be restricted to the memory nodes specified for this cpuset. By default ( 0), page and buffer data is shared across processes belonging to multiple users. With a hardwall enabled ( 1), each tasks' user allocation can be kept separate.
        cpuset.memory_pressure_enabled : contains a flag ( 0 or 1) that specifies whether the system should compute the memory pressure created by the processes in this cgroup
        cpuset.memory_spread_page : contains a flag ( 0 or 1) that specifies whether file system buffers should be spread evenly across the memory nodes allocated to this cpuset. By default ( 0), no attempt is made to spread memory pages for these buffers evenly, and buffers are placed on the same node on which the process that created them is running. 
        cpuset.memory_spread_slab : contains a flag ( 0 or 1) that specifies whether kernel slab caches for file input/output operations should be spread evenly across the cpuset. By default ( 0), no attempt is made to spread kernel slab caches evenly, and slab caches are placed on the same node on which the process that created them is running.
        cpuset.sched_load_balance : contains a flag ( 0 or 1) that specifies whether the kernel will balance loads across the CPUs in this cpuset. By default ( 1), the kernel balances loads by moving processes from overloaded CPUs to less heavily used CPUs.

Dispositivos:

The devices subsystem allows or denies access to devices by tasks in a cgroup. 
    devices.allow : specifies devices to which tasks in a cgroup have access. Each entry has four fields: type, major, minor, and access.
    type can be of following three values: 
        a - applies to all devices
        b - block devices
        c - character devices
    access is a sequence of one or more letters: 
        r read from device
        w write to device
        m create device files that do not yet exist

    devices.deny : similar syntax as above
    devices.list : reports devices for which access control has been set for tasks in this cgroup

Memoria:

El subsistema de memoria genera informes automáticos sobre los recursos de memoria utilizados por las tareas en un cgroup y establece límites en el uso de memoria por parte de esas tareas. Parámetros modificables de memoria:memoria.limit_in_bytes:establece la cantidad máxima de memoria de usuario. puede usar sufijos como K para kilo y M para mega, etc. Esto solo limita los grupos más bajos en la jerarquía. es decir, el cgroup raíz no se puede limitarmemory.memsw.limit_in_bytes:establece la cantidad máxima para la suma de la memoria y el uso de intercambio. de nuevo, esto no puede limitar el cgroup raíz.

    Note: memory.limit_in_bytes should always be set before memory.memsw.limit_in_bytes because only after limit, can swp limit be set
    memory.force_empty : when set to 0, empties memory of all pages used by tasks in this cgroup
    memory.swappiness : sets the tendency of the kernel to swap out process memory used by tasks in this cgroup instead of reclaiming pages from the page cache. he default value is 60. Values lower than 60 decrease the kernel's tendency to swap out process memory, values greater than 60 increase the kernel's tendency to swap out process memory, and values greater than 100 permit the kernel to swap out pages that are part of the address space of the processes in this cgroup. 


    Note: Swappiness can only be asssigned to leaf groups in the cgroups architecture. i.e if any cgroup has a child cgroup, we cannot set the swappiness for that
    memory.oom_control : contains a flag ( 0 or 1) that enables or disables the Out of Memory killer for a cgroup. If enabled ( 0), tasks that attempt to consume more memory than they are allowed are immediately killed by the OOM killer. 

net_cls:

El subsistema net_cls etiqueta los paquetes de red con un identificador de clase (classid) que permite que el controlador de tráfico de Linux (tc) identifique los paquetes que se originan en un cgroup en particular. El controlador de tráfico se puede configurar para asignar diferentes prioridades a los paquetes de diferentes cgroups.

net_cls.classid : 0XAAAABBBB AAAA = major number (hex)
                         BBBB = minor number (hex)
        net_cls.classid contains a single value that indicates a traffic control handle. The value of classid read from the net_cls.classid file is presented in the decimal format while the value to be written to the file is expected in the hexadecimal format. e.g. 0X100001 = 10:1

net_prio :

El subsistema Network Priority (net_prio) proporciona una forma de establecer dinámicamente la prioridad del tráfico de red para cada interfaz de red para aplicaciones dentro de varios cgroups. La prioridad de una red es un número asignado al tráfico de red y utilizado internamente por el sistema y los dispositivos de red. La prioridad de la red se utiliza para diferenciar los paquetes que se envían, se ponen en cola o se descartan. El controlador de tráfico (tc) es responsable de establecer la prioridad de las redes.

net_prio.ifpriomap : networkinterface , priority (/cgroup/net_prio/iscsi/net_prio.ifpriomap)
        Contents of the net_prio.ifpriomap file can be modified by echoing a string into the file using the above format, for example:

            ~]# echo "eth0 5" > /cgroup/net_prio/iscsi/net_prio.ifpriomap

Linux
  1. Encuentre los principales procesos en ejecución por mayor uso de memoria y CPU en Linux

  2. Límite de memoria PHP

  3. ¿Recuperar el uso de la CPU y el uso de la memoria de un solo proceso en Linux?

  4. Servidor CPU y GPU con LAMP

  5. ¿Cómo investigar una pérdida de memoria con Apache y PHP?

Cómo aumentar la memoria y la CPU en la máquina Vagrant

Cómo administrar cgroups con CPUShares

Cómo encontrar los 10 principales procesos en ejecución por memoria y uso de CPU

Supervisión eficaz del ancho de banda de la red, la CPU y la memoria

Cómo encontrar los principales procesos en ejecución por memoria y uso de CPU en Linux

Límite de memoria y límite de CPU en Docker Container