Red Hat Training

A Red Hat training course is available for RHEL 8

9.3.2. Definição de limites de CPU para aplicações usando cgroups-v2

Às vezes uma aplicação utiliza muito tempo de CPU, o que pode ter um impacto negativo na saúde geral de seu ambiente. Use control groups version 2 (cgroups-v2) para configurar limites de CPU para a aplicação, e restringir seu consumo.

Pré-requisitos

Procedimento

  1. Evitar que cgroups-v1 seja montado automaticamente durante a inicialização do sistema:

    # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="cgroup_no_v1=all"

    O comando adiciona um parâmetro de linha de comando do kernel à entrada de inicialização atual. O parâmetro cgroup_no_v1=all impede que cgroups-v1 seja montado automaticamente.

    Alternativamente, use o parâmetro de linha de comando do kernel systemd.unified_cgroup_hierarchy=1 para montar cgroups-v2 durante a inicialização do sistema por padrão.

    Nota

    A RHEL 8 apoia tanto cgroups-v1 como cgroups-v2. Entretanto, cgroups-v1 é habilitado e montado por padrão durante o processo de inicialização.

  2. Reinicie o sistema para que as mudanças entrem em vigor.
  3. Opcionalmente, verifique se a funcionalidade cgroups-v1 foi desativada:

    # mount -l | grep cgroup
    tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
    cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)

    Se cgroups-v1 tiver sido desativado com sucesso, a saída não mostra nenhuma referência "tipo cgroup", exceto aquelas que pertencem a systemd.

  4. Monte cgroups-v2 em qualquer parte do sistema de arquivos:

    # mount -t cgroup2 none <MOUNT_POINT>
  5. Opcionalmente, verifique se a funcionalidade cgroups-v2 foi montada:

    # mount -l | grep cgroup2
    none on /cgroups-v2 type cgroup2 (rw,relatime,seclabel)

    O exemplo de saída mostra que cgroups-v2 foi montado no diretório /cgroups-v2/.

  6. Opcionalmente, inspecionar o conteúdo do diretório /cgroups-v2/:

    # ll /cgroups-v2/
    -r—​r—​r--. 1 root root 0 Mar 13 11:57 cgroup.controllers
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 cgroup.max.depth
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 cgroup.max.descendants
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 cgroup.procs
    -r—​r—​r--. 1 root root 0 Mar 13 11:57 cgroup.stat
    -rw-r—​r--. 1 root root 0 Mar 13 11:58 cgroup.subtree_control
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 cgroup.threads
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 cpu.pressure
    -r—​r—​r--. 1 root root 0 Mar 13 11:57 cpuset.cpus.effective
    -r—​r—​r--. 1 root root 0 Mar 13 11:57 cpuset.mems.effective
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 io.pressure
    -rw-r—​r--. 1 root root 0 Mar 13 11:57 memory.pressure

    O diretório /cgroups-v2/, também chamado de grupo de controle raiz, contém alguns arquivos de interface (começando por cgroup) e alguns arquivos específicos do controlador, como cpuset.cpus.effective.

  7. Identificar os IDs de processo (PIDs) das aplicações que você deseja restringir no consumo da CPU:

    # top
    top - 15:39:52 up  3:45,  1 user,  load average: 0.79, 0.20, 0.07
    Tasks: 265 total,   3 running, 262 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 74.3 us,  6.1 sy,  0.0 ni, 19.4 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
    MiB Mem :   1826.8 total,    243.8 free,   1102.1 used,    480.9 buff/cache
    MiB Swap:   1536.0 total,   1526.2 free,      9.8 used.    565.6 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     5473 root      20   0  228440   1740   1456 R  99.7   0.1   0:12.11 sha1sum
     5439 root      20   0  222616   3420   3052 R  60.5   0.2   0:27.08 cpu_load_generator
     2170 jdoe      20   0 3600716 209960  67548 S   0.3  11.2   1:18.50 gnome-shell
     3051 root      20   0  274424   3976   3092 R   0.3   0.2   1:01.25 top
        1 root      20   0  245448  10256   5448 S   0.0   0.5   0:02.52 systemd
    ...

    O exemplo de saída do programa top revela que PID 5473 e 5439 (aplicação ilustrativa sha1sum e cpu_load_generator) consomem muitos recursos, ou seja, CPU. Ambos são exemplos de aplicações utilizadas para demonstrar o gerenciamento da funcionalidade cgroups-v2.

  8. Habilitar os controladores relacionados à CPU:

    # echo "+cpu" > /cgroups-v2/cgroup.subtree_control
    # echo "+cpuset" > /cgroups-v2/cgroup.subtree_control

    Os comandos anteriores habilitam os controladores cpu e cpuset para os grupos de sub-controle imediatos do grupo de controle raiz /cgroups-v2/.

  9. Crie um subdiretório no diretório /cgroups-v2/ previamente criado:

    # mkdir /cgroups-v2/Example/

    O diretório /cgroups-v2/Example/ representa um grupo de sub-controle, onde você pode colocar processos específicos e aplicar vários limites de CPU aos processos. Além disso, a etapa anterior habilitou os controladores cpu e cpuset para este grupo de sub-controle.

    No momento da criação de /cgroups-v2/Example/, alguns cgroups-v2 arquivos de interface e cpu e cpuset arquivos específicos do controlador serão criados no diretório.

  10. Opcionalmente, inspecionar o grupo de controle recém-criado:

    # ll /cgroups-v2/Example/
    -r—​r—​r--. 1 root root 0 Mar 13 14:48 cgroup.controllers
    -r—​r—​r--. 1 root root 0 Mar 13 14:48 cgroup.events
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.freeze
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.max.depth
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.max.descendants
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.procs
    -r—​r—​r--. 1 root root 0 Mar 13 14:48 cgroup.stat
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.subtree_control
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.threads
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cgroup.type
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpu.max
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpu.pressure
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpuset.cpus
    -r—​r—​r--. 1 root root 0 Mar 13 14:48 cpuset.cpus.effective
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpuset.cpus.partition
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpuset.mems
    -r—​r—​r--. 1 root root 0 Mar 13 14:48 cpuset.mems.effective
    -r—​r—​r--. 1 root root 0 Mar 13 14:48 cpu.stat
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpu.weight
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 cpu.weight.nice
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 io.pressure
    -rw-r—​r--. 1 root root 0 Mar 13 14:48 memory.pressure

    O exemplo de saída mostra arquivos como cpuset.cpus e cpu.max. Os arquivos são específicos para os controladores cpuset e cpu que você habilitou para os grupos de controle infantil direto da raiz (/cgroups-v2/) usando o arquivo /cgroups-v2/cgroup.subtree_control. Além disso, há arquivos de interface de controle cgroup gerais como cgroup.procs ou cgroup.controllers, que são comuns a todos os grupos de controle, independentemente dos controladores habilitados.

    Por padrão, o recém-criado grupo de sub-controle herdou o acesso a todos os recursos da CPU do sistema sem um limite.

  11. Certifique-se de que os processos que você deseja limitar competem pelo tempo de CPU na mesma CPU:

    # echo "1" > /cgroups-v2/Example/cpuset.cpus

    O comando anterior assegura os processos que você colocou no grupo de sub-controle Example, competindo na mesma CPU. Esta configuração é importante para que o controlador cpu seja ativado.

    Importante

    O controlador cpu só é ativado se o grupo de sub-controle relevante tiver pelo menos 2 processos, que competem pelo tempo em uma única CPU.

  12. Configurar os limites da CPU do grupo de controle:

    # echo "200000 1000000" > /cgroups-v2/Example/cpu.max

    O primeiro valor é a quota de tempo permitida em microssegundos para a qual todos os processos coletivamente em um grupo de sub-controle podem ser executados durante um período (especificado pelo segundo valor). Durante um único período, quando os processos em um grupo de controle esgotam coletivamente todo o tempo especificado por esta cota, eles são acelerados durante o restante do período e não podem funcionar até o período seguinte.

    O comando exemplo estabelece os limites de tempo da CPU para que todos os processos coletivamente no grupo de sub-controle Example possam ser executados na CPU apenas por 0,2 segundos a cada 1 segundo.

  13. Opcionalmente, verificar os limites:

    # cat /cgroups-v2/Example/cpu.max
    200000 1000000
  14. Adicione os PIDs das aplicações ao grupo de sub-controle Example:

    # echo "5473" > /cgroups-v2/Example/cgroup.procs
    # echo "5439" > /cgroups-v2/Example/cgroup.procs

    Os comandos de exemplo asseguram que as aplicações desejadas se tornem membros do grupo de sub-controle Example e, portanto, não excedam os limites de CPU configurados para o grupo de sub-controle Example.

  15. Verificar se as aplicações são executadas no grupo de controle especificado:

    # cat /proc/5473/cgroup /proc/5439/cgroup
    1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service
    0::/Example
    1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service
    0::/Example

    O exemplo de saída acima mostra que os processos das aplicações desejadas são executados no grupo de sub-controle Example.

  16. Inspecione o consumo atual da CPU de suas aplicações aceleradas:

    # top
    top - 15:56:27 up  4:02,  1 user,  load average: 0.03, 0.41, 0.55
    Tasks: 265 total,   4 running, 261 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  9.6 us,  0.8 sy,  0.0 ni, 89.4 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
    MiB Mem :   1826.8 total,    243.4 free,   1102.1 used,    481.3 buff/cache
    MiB Swap:   1536.0 total,   1526.2 free,      9.8 used.    565.5 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     5439 root      20   0  222616   3420   3052 R  10.0   0.2   6:15.83 cpu_load_generator
     5473 root      20   0  228440   1740   1456 R  10.0   0.1   9:20.65 sha1sum
     2753 jdoe      20   0  743928  35328  20608 S   0.7   1.9   0:20.36 gnome-terminal-
     2170 jdoe      20   0 3599688 208820  67552 S   0.3  11.2   1:33.06 gnome-shell
     5934 root      20   0  274428   5064   4176 R   0.3   0.3   0:00.04 top
     ...

    Observe que o consumo de CPU para os sites PID 5439 e PID 5473 diminuiu para 10%. O grupo de sub-controle Example limita seus processos a 20% do tempo da CPU coletivamente. Como existem 2 processos no grupo de controle, cada um pode utilizar 10% do tempo da CPU.

Recursos adicionais