Configure VMs compatíveis com NUMA

Este documento descreve como configurar clusters e VMs para suportar cargas de trabalho de alto desempenho e baixa latência com as eficiências de computação do acesso à memória não uniforme (NUMA). Existem instruções para ajustar as definições do Kubernetes para os nós do cluster. Este documento também inclui instruções para configurar máquinas virtuais (VMs) com afinidade NUMA para que sejam agendadas e tirem partido dos nós NUMA.

Com uma VM compatível com NUMA, toda a comunicação na VM é local para o nó NUMA. A VM compatível com NUMA evita transações de dados de e para recursos remotos que podem degradar o desempenho da VM.

Configure nós para usar NUMA

As secções seguintes descrevem como configurar os componentes críticos do Kubernetes para otimizar o nó e garantir que consegue agendar contentores compatíveis com NUMA. Estes nós NUMA são ajustados para otimizar o desempenho da CPU e da memória. Siga as instruções para cada nó no qual quer executar VMs compatíveis com NUMA.

Atualize a configuração do kubelet

Como parte da configuração do nó para suportar a afinidade do nó NUMA, tem de fazer as seguintes alterações na configuração do kubelet:

  • Ative o CPU Manager com uma política static
  • Ative o Gestor de memória com uma política Static
  • Ative o gestor de topologia com a topologia restricted

Para configurar o kubelet no nó trabalhador:

  1. Localize o ficheiro kubelet no nó de trabalho e abra-o para edição:

    edit /etc/default/kubelet
    

    Se não vir o ficheiro kubelet, crie-o com o seguinte comando:

    echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubelet
    

    Este comando cria o ficheiro kubelet com uma secção KUBELET_EXTRA_ARGS="" vazia.

  2. Para ativar o CPU Manager com uma política static, adicione a flag --cpu-manager-policy=static à secção KUBELET_EXTRA_ARGS="" do ficheiro:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
    
  3. Para ativar o Memory Manager com uma política Static, adicione a flag --memory-manager-policy=Static à secção KUBELET_EXTRA_ARGS="" do ficheiro:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
    
  4. Para ativar o Topology Manager com uma política restricted, adicione a flag --topology-manager-policy=restricted à secção KUBELET_EXTRA_ARGS="" do ficheiro:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
    
  5. Verifique a quantidade atual de memória reservada pelo Google Distributed Cloud:

    cat /var/lib/kubelet/kubeadm-flags.env
    

    O resultado deve ter o seguinte aspeto:

    KUBELET_KUBEADM_ARGS="--anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --feature-gates=SeccompDefault=true --kube-reserved=cpu=100m,memory=3470Mi --max-pods=110 --node-ip=192.168.1.190 --node-labels=baremetal.cluster.gke.io/k8s-ip=192.168.1.190,baremetal.cluster.gke.io/namespace=cluster-user001,baremetal.cluster.gke.io/node-pool=node-pool-1,cloud.google.com/gke-nodepool=node-pool-1 --pod-infra-container-image=gcr.io/anthos-baremetal-release/pause-amd64:3.1-gke.5 --provider-id=baremetal://192.168.1.190 --read-only-port=10255 --rotate-server-certificates=true --seccomp-default=true"

    A definição --kube-reserved=cpu=100m,memory=3470Mi indica que o Google Distributed Cloud reservou 3470 mebibytes de memória no nó.

  6. Defina a flag --reserved-memory na secção KUBELET_EXTRA_ARGS do ficheiro kubelet para 100 mebibytes acima da memória reservada atual para ter em conta o limite de despejo. Se não houver memória reservada, pode ignorar este passo.

    Por exemplo, com a memória reservada de 3470Mi do exemplo no passo anterior, reserva 3570Mi de memória no ficheiro kubelet:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
    
  7. Remova os ficheiros de estado da CPU e da memória do diretório /var/lib:

    rm /var/lib/cpu_manager_state
    rm /var/lib/memory_manager_state
    
  8. Reinicie o kubelet:

    systemctl start kubelet
    

Para mais informações sobre estas definições de políticas, consulte a seguinte documentação do Kubernetes:

Configure o nó para usar páginas grandes

Depois de ativar o Memory Manager com a política Static, pode adicionar páginas enormes para melhorar ainda mais o desempenho da carga de trabalho do contentor nos seus nós NUMA. As páginas enormes, como o nome sugere, permitem especificar páginas de memória maiores do que os 4 kibibytes (KiB) padrão. O tempo de execução da VM no GDC suporta páginas grandes de 2 mebibytes (MiB) e 1 gibibyte (GiB). Pode definir páginas grandes para um nó em tempo de execução ou para quando a máquina do nó arranca. Recomendamos que configure as páginas enormes em cada nó no qual quer executar VMs compatíveis com NUMA.

  1. Para configurar o número de páginas enormes de um tamanho específico no seu nó NUMA em tempo de execução, use o seguinte comando:

    echo HUGEPAGE_QTY > \
        /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepages
    

    Substitua o seguinte:

    • HUGEPAGE_QTY: o número de páginas enormes a atribuir do tamanho especificado.

    • NUMA_NODE: o nó NUMA, como node0, ao qual está a atribuir páginas grandes.

    • HUGEPAGE_SIZE: o tamanho das páginas enormes em kibibytes, 2048 (2 MiB) ou1048576 (1 GiB).

Configure uma VM para usar o nó NUMA

Depois de os nós do cluster serem otimizados para NUMA, pode criar VMs compatíveis com NUMA. As VMs compatíveis com NUMA são agendadas em nós NUMA.

Para criar uma VM compatível com NUMA:

  1. Siga as instruções para criar uma VM a partir de um manifesto.

    Use as seguintes computedefinições para configurar a VM de modo a ter em conta a NUMA:

    • spec.compute.guaranteed: defina guaranteed como true. Com esta definição, o pod virt-launcher é configurado para ser colocado na classe de Qualidade de Serviço (QoS) garantida do Kubernetes.

    • spec.compute.advancedCompute:

      • dedicatedCPUPlacement: defina dedicatedCPUPlacement como true. Esta definição associa as CPUs virtuais às CPUs físicas do nó.
      • hugePageSize: defina hugePageSize como 2Mi ou 1Gi para especificar o tamanho das páginas enormes que a sua VM vai usar, 2 mebibytes ou 1 gibibyte.
      • numaGuestMappingPassthrough: inclua uma estrutura vazia ({}) para esta definição. Esta definição estabelece a afinidade NUMA para que a sua VM seja agendada apenas em nós NUMA.

    O exemplo seguinte do manifesto VirtualMachine mostra o aspeto de uma configuração de VM compatível com NUMA:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: vm1
    spec:
      compute:
        cpu:
          vcpus: 2
        guaranteed: true
        advancedCompute:
          dedicatedCPUPlacement: true
          hugePageSize: 2Mi
          numaGuestMappingPassthrough: {}
        memory:
          capacity: 256Mi
      interfaces:
      - name: eth0
        networkName: pod-network
        default: true
      disks:
      - virtualMachineDiskName: disk-from-gcs
        boot: true
        readOnly: true