Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Ativar a política de otimização de desempenho CPU Burst

Última atualização: Jun 27, 2026

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.

Nota

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.

CPU usage comparison: per-second vs millisecond-level

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.

Nota

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:

Nota

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 ack-slo-pod-config

Média

Cluster inteiro

ConfigMap ack-slo-config

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

  1. Crie o arquivo configmap.yaml com 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
  2. Aplique o ConfigMap. Use PATCH se o ack-slo-config já existir no namespace kube-system para 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

  1. Crie o arquivo configmap.yaml com 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.
  2. Aplique o ConfigMap. Use PATCH se o ack-slo-pod-config já existir no namespace koordinator-system para 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.

  1. Crie o arquivo apache-demo.yaml com 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
  2. Implante o Apache HTTP Server.

    kubectl apply -f apache-demo.yaml
  3. Execute um teste de carga usando wrk2. Substitua $target_ip_address pelo 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.

Importante

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}'
Nota

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>

Nota
  • Quando policy está definido como cfsQuotaBurstOnly ou auto, o cpu.cfs_quota_us muda dinamicamente com base em eventos de limitação.

  • Durante testes de estresse, monitore o uso de CPU do pod ou defina policy como cpuBurstOnly ou none para 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.

Nota

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. O cpu.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 o cpu.cfs_quota_us de todos os pods para evitar que um único pod cause interferência. Defina sharePoolThresholdPercent com 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.

  1. Injete limits.cpu como variável de ambiente usando resourceFieldRef.

    env:
      - name: CPU_LIMIT
        valueFrom:
          resourceFieldRef:
            resource: limits.cpu
  2. Atualize a lógica de inicialização da sua aplicação para ler CPU_LIMIT ao 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.