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
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 quePID 6955
(aplicação ilustrativasha1sum
) consome muitos recursos de CPU.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
ecpu
arquivos específicos do controlador serão criados no diretório.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 controleExample
. 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.
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 porcpu.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 porcpu.cfs_quota_us
) de cada 1 segundo (definido porcpu.cfs_period_us
).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
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 controleExample
. O PID deve representar um processo existente no sistema. OPID 6955
aqui foi atribuído ao processosha1sum /dev/zero &
, utilizado para ilustrar o caso de uso do controladorcpu
.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.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
- Para informações sobre o conceito de grupos de controle, ver Seção 44.1, “Entendendo os grupos de controle”.
-
Para mais informações sobre controladores de recursos, consulte a seção Seção 44.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)
.