Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-11-28 GMT+08:00

Intermitência de CPU

Se um limite de CPU for definido para um contêiner no pod, o uso da CPU do contêiner não poderá exceder o limite. A limitação frequente do tráfego de CPU afeta o desempenho do serviço e aumenta a latência da resposta de cauda longa, especialmente para serviços sensíveis à latência.

A intermitência da CPU é um mecanismo de limitação de tráfego elástico que permite exceder temporariamente o limite da CPU para reduzir o tempo de resposta de cauda longa dos serviços. Quando a cota de CPU para um serviço em cada período de agendamento de CPU permanece, o sistema acumula a cota de CPU. Se o limite de CPU precisar ser excedido em períodos de agendamento subsequentes, a cota de CPU acumulada poderá ser usada.

  • Se a intermitência de CPU não estiver ativada, a cota de CPU de um contêiner não poderá exceder o limite e os recursos de intermitência acumulados não poderão ser usados.
    Figura 1 Intermitência da CPU não ativada
  • Depois que a intermitência de CPU é ativada, a cota de CPU de um contêiner pode exceder o limite para usar os recursos de intermitência acumulados.
    Figura 2 Intermitência da CPU ativada

Restrições

  • Versão do cluster: cluster do CCE Turbo v1.23.5-r0 ou posterior
  • Versão de SO: Huawei Cloud EulerOS 2.0
  • O complemento volcano de 1.9.0 ou posterior deve ser instalado no cluster e a função de implementação híbrida deve estar habilitada (isto é, colocation_enable nas configurações avançadas deve ser definido como true).

Procedimento

  1. Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster.
  2. No painel de navegação à esquerda, escolha Nodes. Clique na guia Node Pools. Ao criar ou atualizar um pool de nós, ative a implementação híbrida de serviços on-line e offline em Advanced Settings.

    • volcano.sh/oversubscription=true
    • volcano.sh/colocation=true
    Figura 3 Configurações de rótulo do nó

  3. No painel de navegação à esquerda, escolha Add-ons. Clique em Install sob volcano. Na área Advanced Settings, defina colocation_enable como true para permitir a implementação híbrida de serviços on-line e off-line. Para obter detalhes sobre a instalação, consulte Volcano scheduler.

    Se o complemento vulcão tiver sido instalado, clique em Edit para exibir ou modificar o parâmetro colocation_enable.

    Figura 4 Ativar a implementação híbrida de serviços on-line e off-line

  4. Ativar intermitência da CPU.

    Depois de confirmar que o complemento volcano está funcionando, execute o seguinte comando para editar o parâmetro configmap de volcano-agent-configuration no namespace de kube-system. Se a opção enable estiver definida como true, a intermitência da CPU será ativada. Se enable for definido como false, a intermitência da CPU será desativada.
    kubectl edit configmap -nkube-system volcano-agent-configuration

    Exemplo:

    cpuBurstConfig: 
      enable: true

    Depois que a intermitência da CPU é desativada, essa função ainda é ativada nos pods existentes onde a intermitência da CPU foi ativada. A desativação da intermitência da CPU só tem efeito em novos pods.

  5. Implemente uma carga de trabalho em um pool de nós onde a implementação híbrida foi ativada. Tome Nginx como exemplo. Defina requests para 2 e limits para 4 e crie um Serviço que possa ser acessado no cluster para a carga de trabalho.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
          annotations: 
            volcano.sh/enable-quota-burst: "true"
            volcano.sh/quota-burst-time: "200000"
        spec:
          containers:
          - name: container-1
            image: nginx:latest
            resources:
              limits:
                cpu: "4"
              requests:
                cpu: "2"
          imagePullSecrets:
            - name: default-secret
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
      labels:
        app: nginx
    spec:
      selector:
        app: nginx
      ports:
        - name: cce-service-0
          targetPort: 80
          nodePort: 0
          port: 80
          protocol: TCP
      type: ClusterIP

    Anotação

    Obrigatório

    Descrição

    volcano.sh/enable-quota-burst

    Sim

    A intermitência da CPU está ativada para a carga de trabalho.

    volcano.sh/quota-burst-time

    Não

    Para garantir a estabilidade do agendamento da CPU e reduzir a contenção quando vários contêineres enfrentam intermitências de CPU ao mesmo tempo, o valor padrão de CPU Burst é o mesmo que o valor de CPU Quota. Ou seja, um contêiner pode usar no máximo duas vezes o valor do CPU Limit. Por padrão, CPU Burst é definido para todos os contêineres de serviço em um pod.

    Neste exemplo, o CPU Limit do contêiner é 4, ou seja, o valor padrão é 400,000 (1 núcleo = 100.000), indicando que um máximo de quatro núcleos adicionais podem ser usados após o valor de CPU Limit ser atingido.

  6. Verificar intermitência da CPU.

    Você pode usar a ferramenta wrk para aumentar a carga da carga de trabalho e observar a latência do serviço, a limitação de tráfego e o limite de CPU excedendo quando a Intermitência de CPU é ativada e desativada, respectivamente.

    1. Execute o seguinte comando para aumentar a carga do pod. <service_ip> indica o endereço IP de serviço associado ao pod.
      # Download and install the wrk tool on the node.
      # The Gzip compression module is enabled in the Apache configuration to simulate the computing logic for the server to process requests.
      # Run the following command to increase the load. Note that you need to change the IP address of the target application.
      wrk -H "Accept-Encoding: deflate, gzip" -t 4 -c 28 -d 120  --latency --timeout 2s http://<service_ip>
    2. Obtenha o ID do pod.
      kubectl get pod -n <namespace> <pod_name> -o jsonpath='{.metadata.uid}'
    3. Você pode executar os seguintes comandos no nó para exibir o status de limitação de tráfego e o limite de CPU excedendo o status. No comando, <pod_id> indica o ID do pod.
      cat /sys/fs/cgroup/cpu/kubepods/burstable/pod<pod_id>/cpu.stat
      Informação semelhante à seguinte é exibida.
      nr_periods 0  # Number of scheduling periods
      nr_throttled 0  # Traffic limiting times
      throttled_time 0  # Traffic limiting duration (ns)
      nr_bursts 0 # CPU Limit exceeding times
      burst_time 0 # Total Limit exceeding duration
      Tabela 1 Resumo do resultado neste exemplo

      Intermitência de CPU

      Latência P99

      nr_throttled

      Tempos de limitação de tráfego

      throttled_time

      Duração do limite de tráfego

      nr_bursts

      Limite de tempos excedentes

      bursts_time

      Limite total que excede a duração

      Não ativada

      2,96 ms

      986

      14,3s

      0

      0

      Ativada

      456 μs

      0

      0

      469

      3,7s