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
- Uma aplicação cujo consumo de CPU você deseja restringir.
- Seção 9.1, “Entendendo os grupos de controle”
Procedimento
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 quecgroups-v1
seja montado automaticamente.Alternativamente, use o parâmetro de linha de comando do kernel
systemd.unified_cgroup_hierarchy=1
para montarcgroups-v2
durante a inicialização do sistema por padrão.NotaA RHEL 8 apoia tanto
cgroups-v1
comocgroups-v2
. Entretanto,cgroups-v1
é habilitado e montado por padrão durante o processo de inicialização.- Reinicie o sistema para que as mudanças entrem em vigor.
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 asystemd
.Monte
cgroups-v2
em qualquer parte do sistema de arquivos:# mount -t cgroup2 none <MOUNT_POINT>
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/
.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 porcgroup
) e alguns arquivos específicos do controlador, comocpuset.cpus.effective
.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 quePID 5473
e5439
(aplicação ilustrativasha1sum
ecpu_load_generator
) consomem muitos recursos, ou seja, CPU. Ambos são exemplos de aplicações utilizadas para demonstrar o gerenciamento da funcionalidadecgroups-v2
.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
ecpuset
para os grupos de sub-controle imediatos do grupo de controle raiz/cgroups-v2/
.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 controladorescpu
ecpuset
para este grupo de sub-controle.No momento da criação de
/cgroups-v2/Example/
, algunscgroups-v2
arquivos de interface ecpu
ecpuset
arquivos específicos do controlador serão criados no diretório.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
ecpu.max
. Os arquivos são específicos para os controladorescpuset
ecpu
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 controlecgroup
gerais comocgroup.procs
oucgroup.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.
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 controladorcpu
seja ativado.ImportanteO controlador
cpu
só é ativado se o grupo de sub-controle relevante tiver pelo menos 2 processos, que competem pelo tempo em uma única CPU.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.Opcionalmente, verificar os limites:
# cat /cgroups-v2/Example/cpu.max 200000 1000000
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-controleExample
.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
.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
ePID 5473
diminuiu para 10%. O grupo de sub-controleExample
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
- Para informações sobre o conceito de grupos de controle, ver Seção 9.1, “Entendendo os grupos de controle”.
-
Para mais informações sobre controladores de recursos, consulte a seção Seção 9.2, “O que são controladores de recursos do kernel” e a página do manual
cgroups(7)
. -
Para mais informações sobre o sistema de arquivos virtuais
/sys/fs/
, consulte a página do manualsysfs(5)
.