Os control groups (cgroups) alocam, gerenciam e monitoram recursos do sistema no Linux. Quando a quantidade ou a profundidade da hierarquia de cgroups cresce excessivamente, o kernel gasta tempo de CPU desproporcional percorrendo essas estruturas, o que degrada o desempenho das aplicações.
Sintomas
Em ambientes de contêineres, esse problema se manifesta da seguinte forma:
Picos intermitentes de latência -- as aplicações apresentam aumentos repentinos e ocasionais na latência das requisições.
Alto uso de CPU pelo kernel -- a métrica
sys(percentual de CPU do kernel) atinge 30% ou mais no host do contêiner.
Execute o comando top para verificar o uso de CPU pelo kernel. Na saída abaixo, o valor sy de 30,0% indica que o kernel consome uma parcela significativa do tempo de CPU:
top - 16:21:19 up 22 days, 1:59, 3 users, load average: 40.02, 30.02, 25.06
Tasks: 193 total, 3 running, 190 sleeping, 0 stopped, 0 zombie
%Cpu(s): 20.0 us, 30.0 sy, 0.0 ni, 45.0 id, 5.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 24130808 total, 2071424 free, 1832512 used, 20226872 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 19737776 avail Mem
Diagnóstico
Verifique a quantidade de cgroups
Execute o comando a seguir para visualizar os estados dos cgroups:
cat /proc/cgroups
A saída lista cada subsistema de cgroup com quatro colunas:
|
Coluna |
Descrição |
|
|
Nome do controlador de cgroup |
|
|
ID da hierarquia de cgroup onde este controlador está montado |
|
|
Quantidade de cgroups que utilizam este controlador |
|
|
Indica se o controlador está ativado ( |
Exemplo de saída:
#subsys_name hierarchy num_cgroups enabled
cpuset 2 200 1
cpu 2 200 1
cpuacct 2 200 1
blkio 6 62 1
memory 10 2040 1
devices 5 59 1
Neste exemplo, o controlador de memória possui 2.040 cgroups, valor muito acima do limite recomendado de 1.000.
Analise o uso de CPU do kernel com perf
Para confirmar se a travessia dos cgroups consome tempo de CPU, utilize o perf para amostrar a atividade do kernel.
-
Instale o
perf:yum install perf -y -
Amostre a atividade de todo o sistema durante 10 segundos:
perf record -a -g sleep 10 -
Visualize os resultados. Se os cgroups causarem o problema, a saída mostrará funções de cgroup de memória dominando o tempo de CPU do kernel:
perf report31.04% [kernel] [k] memcg_stat_show 18.61% [kernel] [k] memcg_sum_events.isra.22 9.41% [kernel] [k] mem_cgroup_iter 6.94% [kernel] [k] css_next_descendant_pre 6.11% [kernel] [k] _find_next_bit 3.96% [kernel] [k] mem_cgroup_usage.part.43 1.75% [kernel] [k] find_next_bit 1.38% [kernel] [k] mem_cgroup_node_nr_lru_pages
Causa raiz
A função memcg_stat_show agrega estatísticas de todos os cgroups de memória. Quando a quantidade de cgroups de memória é excessiva, percorrê-los demanda muito tempo e consome uma parcela significativa da CPU do kernel. Na saída do perf acima, apenas a função memcg_stat_show responde por 31% do tempo de CPU.
Quantidades excessivas de cgroups cpuacct e cpu também podem afetar o Completely Fair Scheduler (CFS) e o mecanismo de balanceamento de carga do kernel Linux.
Diretrizes de prevenção
Para evitar oscilações de desempenho relacionadas a cgroups nas suas instâncias Alibaba Cloud Linux:
Limite os cgroups filhos por pai -- não crie mais de 10 cgroups filhos dentro de cada cgroup.
Restrinja a quantidade total de cgroups -- mantenha o número total de cgroups abaixo de 1.000 em todo o sistema. Quanto menos cgroups, melhor.