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

Agendamento de afinidade NUMA

Conhecimento de fundo

Quando o nó executa muitos pods vinculados à CPU, a carga de trabalho pode mover-se para diferentes núcleos de CPU, dependendo se o pod é acelerado e quais núcleos de CPU estão disponíveis no momento do agendamento. Muitas cargas de trabalho não são sensíveis a essa migração e, portanto, funcionam bem sem qualquer intervenção. No entanto, em cargas de trabalho nas quais a afinidade de cache da CPU e a latência de agendamento afetam significativamente o desempenho da carga de trabalho, o kubelet permite que políticas alternativas de gerenciamento da CPU determinem algumas preferências de posicionamento no nó.

Ambos CPU Manager e Topology Manager são componentes do kubelet, mas têm as seguintes limitações:

  • O agendador não está ciente da topologia. Portanto, a carga de trabalho pode ser agendada em um nó e, em seguida, falhar no nó devido ao Topology Manager. Isso é inaceitável para tarefas TensorFlow. Se algum trabalhador ou ps falhou no nó, a tarefa falhará.
  • Os gerentes são nível de nó que resulta em uma incapacidade de combinar o melhor nó para a topologia NUMA em todo o cluster.

Para obter mais informações, consulte https://github.com/volcano-sh/volcano/blob/master/docs/design/numa-aware.md.

Metas do Volcano para resolver a limitação para fazer a topologia NUMA de agendador consciente, de modo a alcançar o seguinte:

  • Não agende pods para os nós que a topologia NUMA não combina.
  • Agende pods para o melhor nó para topologia NUMA.

Escopo da aplicação

  • Suporte ao agendamento de topologia de recursos da CPU
  • Suporte às políticas de topologia em nível de pod

Previsão de agendamento

Para pods com a política de topologia, predique a lista de nós correspondentes.

Política

Ação

none

1. Nenhuma ação de filtro

best-effort

1. Filtre o nó com a política de topologia best-effort.

restricted

1. Filtre o nó com a política de topologia restricted.

2. Filtre o nó que a topologia de CPU cumpre os requisitos de CPU para restricted.

single-numa-node

1. Filtre o nó com a política de topologia single-numa-node.

2. Filtre o nó que a topologia da CPU atende aos requisitos de CPU para single-numa-node.

Figura 1 Comparação das políticas de agendamento de NUMA

Prioridade de agendamento

A política de topologia visa agendar pods para o nó ideal. Neste exemplo, cada nó é pontuado para classificar o nó ideal.

Princípio: agende pods para os nós de trabalho que exigem o menor número de nós NUMA.

A fórmula de pontuação é a seguinte:

score = weight * (100 - 100 * numaNodeNum / maxNumaNodeNum)

Descrição do parâmetro:

  • weight: indica o peso de NUMA Aware Plugin.
  • numaNodeNum: indica o número de nós NUMA necessários para executar o pod no nó de trabalho.
  • maxNumaNodeNum: indica o número máximo de nós NUMA em um pod de todos os nós de trabalho.

Habilitar o Volcano para suportar agendamento de afinidade NUMA

  1. Habilite a política de gerenciamento da CPU. Para mais detalhes, consulte Ativar a política de gerenciamento da CPU.
  2. Configure uma política de topologia de CPU.

    1. Faça logon no console do CCE, clique no nome do cluster, acesse a página de detalhes do cluster e escolha Nodes no painel de navegação. Na página exibida, clique na guia Node Pools. Escolha More > Manage na coluna Operation do pool de nós de destino.
    2. Altere o valor de topology-manager-policy em kubelet para a política de topologia de CPU necessária. Conforme mostrado na figura a seguir, a política de topologia da CPU é best-effort.

      As políticas de topologia válidas são none, best-effort, restricted e single-numa-node. Para obter detalhes sobre essas políticas, consulte Previsão de agendamento.

  3. Habilite o complemento numa-aware e a função resource_exporter.

    volcano 1.7.1 ou mais tarde

    1. Efetue logon no console do CCE e acesse o console do cluster. No painel de navegação, escolha Add-ons. À direita da página, localize o complemento do volcano e clique em Edit. Na área Parameters, configure os parâmetros do agendador de Volcano.
      {
          "ca_cert": "",
          "default_scheduler_conf": {
              "actions": "allocate, backfill",
              "tiers": [
                  {
                      "plugins": [
                          {
                              "name": "priority"
                          },
                          {
                              "name": "gang"
                          },
                          {
                              "name": "conformance"
                          }
                      ]
                  },
                  {
                      "plugins": [
                          {
                              "name": "drf"
                          },
                          {
                              "name": "predicates"
                          },
                          {
                              "name": "nodeorder"
                          }
                      ]
                  },
                  {
                      "plugins": [
                          {
                              "name": "cce-gpu-topology-predicate"
                          },
                          {
                              "name": "cce-gpu-topology-priority"
                          },
                          {
                              "name": "cce-gpu"
                          },
                          {
                              // add this also enable resource_exporter
                              "name": "numa-aware", 
                              // the weight of the NUMA Aware Plugin
                              "arguments": { 
                                 "weight": "10"
                              }
                          }
                      ]
                  },
                  {
                      "plugins": [
                          {
                              "name": "nodelocalvolume"
                          },
                          {
                              "name": "nodeemptydirvolume"
                          },
                          {
                              "name": "nodeCSIscheduling"
                          },
                          {
                              "name": "networkresource"
                          }
                      ]
                  }
              ]
          },
          "server_cert": "",
          "server_key": ""
      }
    volcano anterior a 1.7.1
    1. O parâmetro resource_exporter_enable está ativado para o complemento de volcano coletar informações de nó NUMA.
      {
         "plugins": {
            "eas_service": {
               "availability_zone_id": "",
               "driver_id": "",
               "enable": "false",
               "endpoint": "",
               "flavor_id": "",
               "network_type": "",
               "network_virtual_subnet_id": "",
               "pool_id": "",
               "project_id": "",
               "secret_name": "eas-service-secret"
            }
         },
         "resource_exporter_enable": "true"
      }
      Depois que esta função é permitida, você pode ver a informação da topologia NUMA do nó atual.
      kubectl get numatopo 
      NAME              AGE
      node-1            4h8m
      node-2            4h8m
      node-3            4h8m
    2. Habilite o complemento do algoritmo numa-aware do volcano.
      kubectl edit cm -n kube-system volcano-scheduler-configmap
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: volcano-scheduler-configmap
        namespace: kube-system
      data:
        default-scheduler.conf: |-
          actions: "allocate, backfill"
          tiers:
          - plugins:
            - name: priority
            - name: gang
            - name: conformance
          - plugins:
            - name: overcommit
            - name: drf
            - name: predicates
            - name: nodeorder
          - plugins:
            - name: cce-gpu-topology-predicate
            - name: cce-gpu-topology-priority
            - name: cce-gpu
          - plugins:
            - name: nodelocalvolume
            - name: nodeemptydirvolume
            - name: nodeCSIscheduling
            - name: networkresource
              arguments:
                NetworkType: vpc-router
            - name: numa-aware # add it to enable numa-aware plugin
              arguments:
                weight: 10 # the weight of the NUMA Aware Plugin

Usar o Volcano para dar suporte ao agendamento de afinidade NUMA

  1. Configure afinidade NUMA para Implementações. O seguinte é um exemplo:

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: numa-tset
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: numa-tset
      template:
        metadata:
          labels:
            app: numa-tset
          annotations:
            volcano.sh/numa-topology-policy: single-numa-node    # set the topology policy
        spec:
          containers:
            - name: container-1
              image: nginx:alpine
              resources:
                requests:
                  cpu: 2           # The value must be an integer and must be the same as that in limits.
                  memory: 2048Mi
                limits:
                  cpu: 2           # The value must be an integer and must be the same as that in requests.
                  memory: 2048Mi
          imagePullSecrets:
          - name: default-secret

  2. Crie uma tarefa de volcano e use a afinidade NUMA.

    apiVersion: batch.volcano.sh/v1alpha1
    kind: Job
    metadata:
      name: vj-test
    spec:
      schedulerName: volcano
      minAvailable: 1
      tasks:
        - replicas: 1
          name: "test"
          topologyPolicy: best-effort   # set the topology policy for task 
          template:
            spec:
              containers:
                - image: alpine
                  command: ["/bin/sh", "-c", "sleep 1000"]
                  imagePullPolicy: IfNotPresent
                  name: running
                  resources:
                    limits:
                      cpu: 20
                      memory: "100Mi"
              restartPolicy: OnFailure

  3. Verifique o uso de NUMA.

    # Check the CPU usage of the current node.
    lscpu
    ...
    CPU(s):              32
    NUMA node(s):        2
    NUMA node0 CPU(s):   0-15
    NUMA node1 CPU(s):   16-31
    
    # Check the CPU allocation of the current node.
    cat /var/lib/kubelet/cpu_manager_state
    {"policyName":"static","defaultCpuSet":"0,10-15,25-31","entries":{"777870b5-c64f-42f5-9296-688b9dc212ba":{"container-1":"16-24"},"fb15e10a-b6a5-4aaa-8fcd-76c1aa64e6fd":{"container-1":"1-9"}},"checksum":318470969}