Red Hat Training

A Red Hat training course is available for RHEL 8

44.3. Usando grupos de controle através de um sistema de arquivo virtual

Você pode usar control groups (cgroups) para estabelecer limites, priorizar ou controlar o acesso aos recursos de hardware para grupos de processos. Isto permite que você controle granularmente o uso de recursos de aplicações para utilizá-los de forma mais eficiente. As seções seguintes fornecem uma visão geral das tarefas relacionadas ao gerenciamento do cgroups tanto para a versão 1 como para a versão 2, utilizando um sistema de arquivo virtual.

44.3.1. Definição de limites de CPU para aplicações usando cgroups-v1

Às vezes uma aplicação consome muito tempo de CPU, o que pode ter um impacto negativo na saúde geral de seu ambiente. Use o sistema de arquivo virtual /sys/fs/ para configurar os limites da CPU para uma aplicação usando control groups version 1 (cgroups-v1).

Pré-requisitos

  • Uma aplicação cujo consumo de CPU você deseja restringir.
  • Verifique se os controladores do cgroups-v1 foram montados:

    # 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)
    cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
    cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
    cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
    ...

Procedimento

  1. Identificar o ID do processo (PID) da aplicação que você deseja restringir no consumo da CPU:

    # top
    top - 11:34:09 up 11 min,  1 user,  load average: 0.51, 0.27, 0.22
    Tasks: 267 total,   3 running, 264 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 49.0 us,  3.3 sy,  0.0 ni, 47.5 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
    MiB Mem :   1826.8 total,    303.4 free,   1046.8 used,    476.5 buff/cache
    MiB Swap:   1536.0 total,   1396.0 free,    140.0 used.    616.4 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     6955 root      20   0  228440   1752   1472 R  99.3   0.1   0:32.71 sha1sum
     5760 jdoe      20   0 3603868 205188  64196 S   3.7  11.0   0:17.19 gnome-shell
     6448 jdoe      20   0  743648  30640  19488 S   0.7   1.6   0:02.73 gnome-terminal-
        1 root      20   0  245300   6568   4116 S   0.3   0.4   0:01.87 systemd
      505 root      20   0       0      0      0 I   0.3   0.0   0:00.75 kworker/u4:4-events_unbound
    ...

    O exemplo de saída do programa top revela que PID 6955 (aplicação ilustrativa sha1sum) consome muitos recursos de CPU.

  2. Criar um subdiretório no diretório do controlador de recursos cpu:

    # mkdir /sys/fs/cgroup/cpu/Example/

    O diretório acima representa um grupo de controle, onde você pode colocar processos específicos e aplicar certos limites de CPU aos processos. Ao mesmo tempo, alguns arquivos de interface cgroups-v1 e cpu arquivos específicos do controlador serão criados no diretório.

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

    # ll /sys/fs/cgroup/cpu/Example/
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cgroup.clone_children
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cgroup.procs
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.stat
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage_all
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage_percpu
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage_percpu_sys
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage_percpu_user
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage_sys
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpuacct.usage_user
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cpu.cfs_period_us
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cpu.cfs_quota_us
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cpu.rt_period_us
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cpu.rt_runtime_us
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 cpu.shares
    -r—​r—​r--. 1 root root 0 Mar 11 11:42 cpu.stat
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 notify_on_release
    -rw-r—​r--. 1 root root 0 Mar 11 11:42 tasks

    O exemplo de saída mostra arquivos, tais como cpuacct.usage, cpu.cfs._period_us, que representam configurações e/ou limites específicos, que podem ser definidos para processos no grupo de controle Example. Observe que os respectivos nomes de arquivos são prefixados com o nome do controlador do grupo de controle ao qual pertencem.

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

  4. Configurar os limites da CPU para o grupo de controle:

    # echo "1000000" > /sys/fs/cgroup/cpu/Example/cpu.cfs_period_us
    # echo "200000" > /sys/fs/cgroup/cpu/Example/cpu.cfs_quota_us

    O arquivo cpu.cfs_period_us representa um período de tempo em microssegundos (µs, aqui representado como "us") para a freqüência com que o acesso de um grupo de controle aos recursos da CPU deve ser realocado. O limite superior é de 1 segundo e o limite inferior é de 1000 microssegundos.

    O arquivo cpu.cfs_quota_us representa a quantidade total de tempo em microssegundos para o qual todos os processos em um grupo de controle podem ser executados coletivamente durante um período (como definido por cpu.cfs_period_us). Assim que os processos em um grupo de controle, durante um único período, esgotam todo o tempo especificado pela cota, eles são acelerados para o restante do período e não podem ser executados até o período seguinte. O limite inferior é de 1000 microssegundos.

    Os comandos do exemplo acima estabelecem os limites de tempo da CPU para que todos os processos coletivamente no grupo de controle Example possam ser executados apenas por 0,2 segundos (definido por cpu.cfs_quota_us) de cada 1 segundo (definido por cpu.cfs_period_us).

  5. Opcionalmente, verificar os limites:

    # cat /sys/fs/cgroup/cpu/Example/cpu.cfs_period_us /sys/fs/cgroup/cpu/Example/cpu.cfs_quota_us
    1000000
    200000
  6. Adicione o PID do aplicativo ao grupo de controle Example:

    # echo "6955" > /sys/fs/cgroup/cpu/Example/cgroup.procs
    
    or
    
    # echo "6955" > /sys/fs/cgroup/cpu/Example/tasks

    O comando anterior assegura que uma aplicação desejada se torne um membro do grupo de controle Example e, portanto, não exceda os limites de CPU configurados para o grupo de controle Example. O PID deve representar um processo existente no sistema. O PID 6955 aqui foi atribuído ao processo sha1sum /dev/zero &, utilizado para ilustrar o caso de uso do controlador cpu.

  7. Verificar se a aplicação é executada no grupo de controle especificado:

    # cat /proc/6955/cgroup
    12:cpuset:/
    11:hugetlb:/
    10:net_cls,net_prio:/
    9:memory:/user.slice/user-1000.slice/user@1000.service
    8:devices:/user.slice
    7:blkio:/
    6:freezer:/
    5:rdma:/
    4:pids:/user.slice/user-1000.slice/user@1000.service
    3:perf_event:/
    2:cpu,cpuacct:/Example
    1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service

    O exemplo acima mostra que o processo da aplicação desejada é executado no grupo de controle Example, que aplica limites de CPU ao processo da aplicação.

  8. Identificar o consumo atual da CPU de sua aplicação acelerada:

    # top
    top - 12:28:42 up  1:06,  1 user,  load average: 1.02, 1.02, 1.00
    Tasks: 266 total,   6 running, 260 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 11.0 us,  1.2 sy,  0.0 ni, 87.5 id,  0.0 wa,  0.2 hi,  0.0 si,  0.2 st
    MiB Mem :   1826.8 total,    287.1 free,   1054.4 used,    485.3 buff/cache
    MiB Swap:   1536.0 total,   1396.7 free,    139.2 used.    608.3 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     6955 root      20   0  228440   1752   1472 R  20.6   0.1  47:11.43 sha1sum
     5760 jdoe      20   0 3604956 208832  65316 R   2.3  11.2   0:43.50 gnome-shell
     6448 jdoe      20   0  743836  31736  19488 S   0.7   1.7   0:08.25 gnome-terminal-
      505 root      20   0       0      0      0 I   0.3   0.0   0:03.39 kworker/u4:4-events_unbound
     4217 root      20   0   74192   1612   1320 S   0.3   0.1   0:01.19 spice-vdagentd
    ...

    Observe que o consumo de CPU do PID 6955 diminuiu de 99% para 20%.

Recursos adicionais