Os limites de CPU impedem que os contêineres consumam mais do que sua parcela alocada de tempo de computação. No entanto, o kernel do Linux aplica esses limites em ciclos de agendamento de 100 milissegundos. Isso significa que um contêiner pode esgotar sua cota em um único ciclo, mesmo quando seu uso médio no último segundo parece normal. O resultado é a limitação de CPU (throttling): as threads são suspensas até o próximo ciclo, o que adiciona latência não visível nas métricas por segundo.
O CPU Burst resolve esse problema ao permitir que os contêineres acumulem cota de CPU não utilizada e a consumam durante picos de demanda de curta duração. O ack-koordinator monitora eventos de limitação e ajusta dinamicamente os parâmetros de cota do cgroup, sem alterar o limite de CPU na especificação do pod. Isso reduz a latência de cauda para cargas de trabalho sensíveis à latência, sem exigir o aumento generalizado dos limites de CPU.
Para aproveitar ao máximo este tópico, familiarize-se com o Agendador CFS e as políticas de gerenciamento de CPU do nó.
Como funciona
A CPU é um recurso de tempo compartilhado. O kernel usa o Completely Fair Scheduler (CFS) para alocar tempo de CPU em ciclos de agendamento fixos. A duração do ciclo é controlada por cpu.cfs_period_us (geralmente 100 ms). O tempo de CPU disponível por ciclo é definido por cpu.cfs_quota_us. Um contêiner com limite de CPU de 4 obtém 400 ms de tempo de CPU por ciclo de 100 ms.
O problema é que o uso da CPU apresenta picos no nível de milissegundo, mesmo quando as médias por segundo parecem baixas. O gráfico abaixo ilustra isso: a linha roxa mostra o uso de CPU por segundo permanecendo bem abaixo de 4 núcleos, enquanto a linha verde indica o uso no nível de milissegundo ultrapassando 4 núcleos em certos períodos. Quando esses picos esgotam a cota do CFS, o kernel limita o contêiner.

A limitação força as threads a aguardar o próximo ciclo de agendamento, aumentando o tempo de resposta (RT) e causando latência de cauda longa. A tabela abaixo demonstra esse cenário na prática para um contêiner de serviço web com limite de CPU de 2 em um nó de 4 núcleos.
<table> <thead> <tr> <td><p>Mesmo quando o uso geral de CPU no último segundo é baixo, a limitação força a Thread 2 a esperar pelo próximo ciclo de agendamento para concluir o processamento da req 2. Isso aumenta o RT da requisição. Esta é uma causa comum de RT de cauda longa.<img></p></td> <td><p>Após ativar o CPU Burst, o contêiner acumula tempo de CPU não utilizado. Ele usa esse tempo durante os picos. Isso melhora o desempenho e reduz a latência.<img></p><p></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <tbody></tbody> </table>
Quando a demanda supera a cota acumulada — como em um aumento repentino de tráfego — o ack-koordinator resolve o gargalo de CPU em segundos, mantendo a carga total do nó dentro de limites seguros.
O ack-koordinator ajusta apenas o parâmetro cfs quota no cgroup do nó. Ele não altera o campo de limite de CPU na especificação do pod.
Casos de uso
Limitação apesar da baixa utilização média. O uso da CPU permanece abaixo do limite na maior parte do tempo, mas picos curtos dentro dos ciclos de agendamento ainda acionam a limitação. O CPU Burst permite que o contêiner utilize a cota acumulada durante esses picos, reduzindo a limitação e melhorando a qualidade do serviço.
Inicialização lenta devido a processos intensivos em CPU. O contêiner exige muita CPU durante a inicialização e o carregamento, estabilizando depois em um estado constante mais baixo. O CPU Burst permite o uso de tempo extra de CPU durante a inicialização, sem exigir um limite de CPU permanentemente alto.
Faturamento
O ack-koordinator é gratuito para instalação e uso. Custos adicionais podem ser aplicados nestes dois casos:
Recursos do nó de trabalho: o ack-koordinator é um componente não gerenciado. Após a instalação, ele executa em seus nós de trabalho e consome recursos deles. Configure as solicitações de recursos para cada módulo durante a instalação.
Métricas do Prometheus: o ack-koordinator expõe métricas de perfil de recursos e agendamento no formato Prometheus. Se você ativar a opção Enable Prometheus monitoring metrics for ACK-Koordinator e usar o Alibaba Cloud Prometheus, essas métricas contam como métricas personalizadas e geram cobranças. Revise os preços de instâncias do Prometheus antes de ativar e use consultas de uso para monitorar o consumo.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster gerenciado ACK Pro edition executando Kubernetes 1.18 ou posterior. Consulte Criar um cluster gerenciado ACK e Atualizar manualmente um cluster.
O ack-koordinator versão 0.8.0 ou posterior instalado no cluster. Consulte ack-koordinator.
Use o Alibaba Cloud Linux como sistema operacional do nó. Seu suporte a CPU Burst no nível de kernel fornece controle de cota mais refinado. Consulte Preciso usar o Alibaba Cloud Linux para ativar a política CPU Burst?.
Ativar o CPU Burst
É possível ativar o CPU Burst em três escopos. A configuração em um escopo mais restrito tem precedência: anotações de pod substituem ConfigMaps de nível de namespace, que substituem o ConfigMap de nível de cluster.
|
Escopo |
Método |
Prioridade |
|
Pod único |
Anotação de pod |
Mais alta |
|
Namespace |
ConfigMap |
Média |
|
Cluster inteiro |
ConfigMap |
Mais baixa |
Ativar para um pod específico
Adicione a anotação sob metadata no YAML do pod. Para um Deployment ou outra carga de trabalho, defina a anotação em template.metadata.
annotations:
# Enable CPU Burst for this pod.
koordinator.sh/cpuBurst: '{"policy": "auto"}'
# Disable CPU Burst for this pod.
koordinator.sh/cpuBurst: '{"policy": "none"}'
Ativar para todo o cluster
-
Crie o arquivo
configmap.yamlcom o seguinte conteúdo.apiVersion: v1 data: cpu-burst-config: '{"clusterStrategy": {"policy": "auto"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "cpuBurstOnly"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "none"}}' kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system -
Aplique o ConfigMap. Use PATCH se o
ack-slo-configjá existir no namespacekube-systempara evitar sobrescrever outras configurações.Se o ConfigMap existir: ``
bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"``Se não existir: ``
bash kubectl apply -f configmap.yaml``
Ativar para um namespace específico
-
Crie o arquivo
configmap.yamlcom o seguinte conteúdo.apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: koordinator-system # Create this namespace manually before first use. data: # Enable or disable CPU Burst for selected namespaces. cpu-burst: | { "enabledNamespaces": ["allowed-ns"], "disabledNamespaces": ["blocked-ns"] } # Enables CPU Burst for all pods in the allowed-ns namespace. Policy is auto. # Disables CPU Burst for all pods in the blocked-ns namespace. Policy is none. -
Aplique o ConfigMap. Use PATCH se o
ack-slo-pod-configjá existir no namespacekoordinator-systempara evitar sobrescrever outras configurações.Se o ConfigMap existir: ``
bash kubectl patch cm -n koordinator-system ack-slo-pod-config --patch "$(cat configmap.yaml)"``Se não existir: ``
bash kubectl apply -f configmap.yaml``
Verificar com teste de carga
Este exemplo usa um pod do Apache HTTP Server para demonstrar que o CPU Burst reduz a latência de acesso.
-
Crie o arquivo
apache-demo.yamlcom o seguinte conteúdo. A anotação ativa o CPU Burst para este pod.apiVersion: v1 kind: Pod metadata: name: apache-demo annotations: koordinator.sh/cpuBurst: '{"policy": "auto"}' # Enable CPU Burst. spec: containers: - command: - httpd - -D - FOREGROUND image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1 imagePullPolicy: Always name: apache resources: limits: cpu: "4" memory: 10Gi requests: cpu: "4" memory: 10Gi nodeName: $nodeName # Replace with the actual node name. hostNetwork: False restartPolicy: Never schedulerName: default-scheduler -
Implante o Apache HTTP Server.
kubectl apply -f apache-demo.yaml -
Execute um teste de carga usando wrk2. Substitua
$target_ip_addresspelo endereço IP do pod Apache.# Download and extract the open-source wrk2 tool. See https://github.com/giltene/wrk2. # The Apache image has Gzip compression enabled to simulate server-side request processing. # Adjust QPS pressure by changing the -R parameter. ./wrk -H "Accept-Encoding: deflate, gzip" -t 2 -c 12 -d 120 --latency --timeout 2s -R 24 http://$target_ip_address:8010/static/file.1m.test
Resultados
As tabelas abaixo comparam o tempo de resposta p99, a taxa de limitação de CPU e a utilização média de CPU do pod — com e sem CPU Burst — tanto no Alibaba Cloud Linux quanto no CentOS.
Tudo desativado: Política CPU Burst definida como
none.Tudo ativado: Política CPU Burst definida como
auto.
Os valores abaixo são teóricos. Os resultados reais dependem do seu ambiente.
<table> <thead> <tr> <td><p><b>Alibaba Cloud Linux</b></p></td> <td><p><b>All disabled</b></p></td> <td><p><b>All enabled</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>apache RT-p99</p></td> <td><p>107,37 ms</p></td> <td><p>67,18 ms (-37,4%)</p></td> </tr> <tr> <td><p>CPU Throttled Ratio</p></td> <td><p>33,3%</p></td> <td><p>0%</p></td> </tr> <tr> <td><p>Average Pod CPU utilization</p></td> <td><p>31,8%</p></td> <td><p>32,6%</p></td> </tr> </tbody> </table><table> <thead> <tr> <td><p><b>CentOS</b></p></td> <td><p><b>All disabled</b></p></td> <td><p><b>All enabled</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>apache RT-p99</p></td> <td><p>111,69 ms</p></td> <td><p>71,30 ms (-36,2%)</p></td> </tr> <tr> <td><p>CPU Throttled Ratio</p></td> <td><p>33%</p></td> <td><p>0%</p></td> </tr> <tr> <td><p>Average Pod CPU utilization</p></td> <td><p>32,5%</p></td> <td><p>33,8%</p></td> </tr> </tbody> </table>
Ativar o CPU Burst reduz o tempo de resposta p99 em aproximadamente 37% e leva a taxa de limitação de CPU a 0%, com mudança insignificante na utilização média de CPU.
Configuração avançada
Configure parâmetros avançados em uma anotação de pod ou em um ConfigMap. As anotações de pod têm precedência, seguidas pelos ConfigMaps de nível de namespace e, por fim, pelo ConfigMap de nível de cluster.
# Example ConfigMap ack-slo-config.
data:
cpu-burst-config: |
{
"clusterStrategy": {
"policy": "auto",
"cpuBurstPercent": 1000,
"cfsQuotaBurstPercent": 300,
"sharePoolThresholdPercent": 50,
"cfsQuotaBurstPeriodSeconds": -1
}
}
# Example pod annotation.
koordinator.sh/cpuBurst: '{"policy": "auto", "cpuBurstPercent": 1000, "cfsQuotaBurstPercent": 300, "cfsQuotaBurstPeriodSeconds": -1}'
As colunas Annotation e ConfigMap indicam se cada parâmetro suporta configuração via anotação de pod ou ConfigMap.
significa suportado.
significa não suportado.
<table> <thead> <tr> <td><p><b>Parameter</b></p></td> <td><p><b>Type</b></p></td> <td><p><b>Description</b></p></td> <td><p><b>Annotation</b></p></td> <td><p><b>ConfigMap</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p><code>policy</code></p></td> <td><p>string</p></td> <td> <ul> <li><p><code>none</code> (padrão): Desativa o CPU Burst. Todos os parâmetros relacionados retornam aos valores iniciais.</p></li> <li><p><code>cpuBurstOnly</code>: Ativa apenas a elasticidade de CPU Burst no nível de kernel do Alibaba Cloud Linux.</p></li> <li><p><code>cfsQuotaBurstOnly</code>: Ativa apenas a elasticidade de cota CFS. Funciona com todas as versões de kernel.</p></li> <li><p><code>auto</code>: Ativa automaticamente ambas as elasticidades — recursos de kernel do Alibaba Cloud Linux e elasticidade de cota CFS.</p></li> </ul></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>cpuBurstPercent</code></p></td> <td><p>int</p></td> <td><p>Padrão: <code>1000</code>. Unidade: porcentagem.</p><p>Para a elasticidade de CPU Burst no nível de kernel do Alibaba Cloud Linux, define quanto o CPU Burst amplifica além do limite de CPU. Mapeia para o parâmetro de cgroup <code>cpu.cfs_burst_us</code>. Para detalhes, consulte <a href="https://www.alibabacloud.com/help/en/document_detail/306980.html#task-2108025">Ativar CPU Burst usando a interface cgroup v1</a>.</p><p>Por exemplo, com a configuração padrão, <code>CPU Limit = 1</code> define <code>cpu.cfs_quota_us</code> como 100.000. Então <code>cpu.cfs_burst_us</code> torna-se 1.000.000 — um aumento de 10 vezes.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>cfsQuotaBurstPercent</code></p></td> <td><p>int</p></td> <td><p>Padrão: <code>300</code>. Unidade: porcentagem.</p><p>Quando a elasticidade de cota CFS está ativada, define o aumento máximo permitido para o parâmetro de cgroup <code>cpu.cfs_quota_us</code>. O padrão é 3 vezes.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>cfsQuotaBurstPeriodSeconds</code></p></td> <td><p>int</p></td> <td><p>Padrão: <code>-1</code>. Unidade: segundos. -1 significa ilimitado.</p><p>Quando a elasticidade de cota CFS está ativada, define por quanto tempo um pod pode consumir CPU com a cota aumentada (<code>cfsQuotaBurstPercent</code>). Após esse período, o <code>cpu.cfs_quota_us</code> do pod retorna ao valor original. Outros pods não são afetados.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>sharePoolThresholdPercent</code></p></td> <td><p>int</p></td> <td><p>Padrão: <code>50</code>. Unidade: porcentagem.</p><p>Quando a elasticidade de cota CFS está ativada, define o limiar seguro de uso de CPU para o nó. Se o uso exceder esse limiar, todos os pods com <code>cpu.cfs_quota_us</code> aumentado retornam aos valores originais.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> </tbody> </table>
Quando
policyestá definido comocfsQuotaBurstOnlyouauto, ocpu.cfs_quota_usmuda dinamicamente com base em eventos de limitação.Durante testes de estresse, monitore o uso de CPU do pod ou defina
policycomocpuBurstOnlyounonepara desativar o ajuste automático de cota CFS. Isso mantém a elasticidade estável em produção.
Perguntas frequentes
Eu usei o CPU Burst com o protocolo antigo do ack-slo-manager. Ainda funciona após atualizar para o ack-koordinator?
Sim. A chave de anotação antiga era alibabacloud.com/cpuBurst. O ack-koordinator suporta totalmente esse protocolo legado, portanto as atualizações são transparentes.
O período de compatibilidade do ack-koordinator para a versão anterior do protocolo terminou em 30 de julho de 2023. Atualize os parâmetros de recursos da versão anterior do protocolo para a versão mais recente.
O ack-koordinator é compatível com as seguintes versões de protocolo.
<table> <thead> <tr> <td><p><span>ack-koordinator</span><b> version</b></p></td> <td><p><b>alibabacloud.com protocol</b></p></td> <td><p><b>koordinator.sh protocol</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>≥0.2.0</p></td> <td><p>Supported</p></td> <td><p>Not supported</p></td> </tr> <tr> <td><p>≥0.8.0</p></td> <td><p>Supported</p></td> <td><p>Supported</p></td> </tr> </tbody> </table>
Por que a limitação de CPU ainda ocorre após ativar o CPU Burst?
A causa mais comum é um erro de sintaxe na configuração que impede a política de entrar em vigor. Verifique sua anotação ou ConfigMap comparando com os exemplos em Configuração avançada.
Se a configuração for válida, a limitação ainda pode ocorrer quando a demanda de CPU atinge o teto de cfsQuotaBurstPercent. Ajuste seus valores de solicitação e limite de CPU para corresponder melhor às necessidades reais da carga de trabalho.
Considere também outros dois fatores:
O
cpu.cfs_quota_usé atualizado somente após o ack-koordinator detectar um evento de limitação, então há um pequeno atraso. Ocpu.cfs_burst_us, por outro lado, é aplicado imediatamente e responde mais rápido. Para obter melhores resultados, use o Alibaba Cloud Linux.Quando a utilização de CPU em todo o nó excede
sharePoolThresholdPercent, o ack-koordinator redefine ocpu.cfs_quota_usde todos os pods para evitar que um único pod cause interferência. DefinasharePoolThresholdPercentcom um valor que reflita seus padrões reais de carga do nó.
Preciso usar o Alibaba Cloud Linux para ativar a política CPU Burst?
O CPU Burst funciona em todos os kernels do Alibaba Cloud Linux e CentOS. O Alibaba Cloud Linux é recomendado: seu suporte a cpu.cfs_burst_us no nível de kernel permite que o ack-koordinator forneça elasticidade de CPU mais refinada do que apenas o ajuste de cota CFS. Para detalhes, consulte Ativar CPU Burst usando a interface cgroup v1.
Após ativar o CPU Burst, por que minha aplicação relata contagens de threads diferentes?
O ack-koordinator ajusta dinamicamente o cpu.cfs_quota_us — a cota de tempo de CPU do contêiner para cada ciclo de agendamento — em resposta a mudanças de carga. Muitas aplicações, incluindo aquelas que usam Runtime.getRuntime().availableProcessors() do Java, leem cpu.cfs_quota_us para calcular os núcleos de CPU disponíveis. Quando a cota muda, a contagem de núcleos relatada também muda, causando flutuação nos tamanhos de pool de threads e em outros parâmetros dependentes de cota.
Corrija isso fazendo com que sua aplicação leia o valor fixo de limits.cpu na especificação do pod.
-
Injete
limits.cpucomo variável de ambiente usandoresourceFieldRef.env: - name: CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpu Atualize a lógica de inicialização da sua aplicação para ler
CPU_LIMITao calcular e definir o tamanho do pool de threads. Isso mantém as contagens de threads estáveis, independentemente de como o ack-koordinator ajusta a cota CFS.