Configura le VM NUMA-aware

Questo documento descrive come configurare cluster e VM per supportare carichi di lavoro ad alte prestazioni e bassa latenza con le efficienze di calcolo dell'accesso alla memoria non uniforme (NUMA). Esistono istruzioni per ottimizzare le impostazioni di Kubernetes per i nodi del cluster. Questo documento include anche le istruzioni per configurare le macchine virtuali (VM) con affinità NUMA in modo che vengano pianificate e utilizzino i nodi NUMA.

Con una VM NUMA-aware, tutta la comunicazione all'interno della VM è locale per il nodo NUMA. La VM NUMA-aware evita le transazioni di dati verso e da risorse remote che possono ridurre le prestazioni della VM.

Configurare i nodi per l'utilizzo di NUMA

Le sezioni seguenti descrivono come configurare i componenti critici di Kubernetes per ottimizzare il nodo e assicurarsi che possa pianificare i contenitori NUMA-aware. Questi nodi NUMA sono ottimizzati per ottimizzare le prestazioni della CPU e della memoria. Segui le istruzioni per ogni nodo su cui vuoi eseguire VM NUMA-aware.

Aggiorna la configurazione di Kubelet

Nell'ambito della configurazione del nodo per supportare l'affinità dei nodi NUMA, devi apportare le seguenti modifiche alla configurazione di kubelet:

  • Attivare Gestione CPU con un criterio static
  • Attivare il gestore della memoria con un criterio Static
  • Attivare Gestione della topologia con la topologia restricted

Per configurare kubelet sul nodo worker:

  1. Individua il file kubelet sul tuo nodo di lavoro e aprilo per la modifica:

    edit /etc/default/kubelet
    

    Se non vedi il file kubelet, creane uno con il seguente comando:

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

    Questo comando crea il file kubelet con una sezione KUBELET_EXTRA_ARGS="" vuota.

  2. Per attivare il gestore della CPU con un criterio static, aggiungi il flag --cpu-manager-policy=static alla sezione KUBELET_EXTRA_ARGS="" del file:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
    
  3. Per attivare Gestione della memoria con un criterio Static, aggiungi il flag --memory-manager-policy=Static alla sezione KUBELET_EXTRA_ARGS="" del file:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
    
  4. Per attivare Topology Manager con un criterio restricted, aggiungi il flag --topology-manager-policy=restricted alla sezione KUBELET_EXTRA_ARGS="" del file:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
    
  5. Controlla la quantità di memoria attualmente riservata da Google Distributed Cloud:

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

    L'output dovrebbe essere simile al seguente:

    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"

    L'impostazione --kube-reserved=cpu=100m,memory=3470Mi indica che Google Distributed Cloud ha riservato 3470 mebibyte di memoria sul nodo.

  6. Imposta il flag --reserved-memory nella sezione KUBELET_EXTRA_ARGS del file kubelet su 100 mebibyte in più rispetto alla memoria riservata corrente per tener conto della soglia di espulsione. Se non è presente memoria riservata, puoi saltare questo passaggio.

    Ad esempio, con la memoria riservata di 3470Mi dell'esempio nel passaggio precedente, puoi riservare 3570Mi di memoria nel file kubelet:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
    
  7. Rimuovi i file relativi allo stato della CPU e della memoria dalla directory /var/lib:

    rm /var/lib/cpu_manager_state
    rm /var/lib/memory_manager_state
    
  8. Riavvia kubelet:

    systemctl start kubelet
    

Per ulteriori informazioni su queste impostazioni di criteri, consulta la seguente documentazione di Kubernetes:

Configura il nodo per l'utilizzo di hugepages

Dopo aver attivato Gestione della memoria con il criterio Static, puoi aggiungere le pagine di grandi dimensioni per migliorare ulteriormente il rendimento del carico di lavoro dei container sui nodi NUMA. Le pagine enormi, come suggerisce il nome, ti consentono di specificare pagine di memoria più grandi degli standard 4 kibibyte (KiB). Il runtime della VM su GDC supporta pagine enormi di 2 mebibyte (MiB) e 1 gibibyte (GiB). Puoi impostare le pagine enormi per un nodo in fase di esecuzione o all'avvio della macchina del nodo. Ti consigliamo di configurare le pagine di grandi dimensioni su ogni nodo su cui vuoi eseguire VM NUMA-aware.

  1. Per configurare il numero di pagine enormi di una dimensione specifica sul nodo NUMA in fase di esecuzione, utilizza il seguente comando:

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

    Sostituisci quanto segue:

    • HUGEPAGE_QTY: il numero di memorie hugepage da allocare della dimensione specificata.

    • NUMA_NODE: il nodo NUMA, ad esempio node0, a cui stai allocando le pagine enormi.

    • HUGEPAGE_SIZE: la dimensione delle pagine enormi in kibibyte, 2048 (2 MiB) o 1048576 (1 GiB).

Configurare una VM per l'utilizzo del nodo NUMA

Una volta ottimizzati i nodi del cluster per NUMA, puoi creare VM compatibili con NUMA. Le VM NUMA-aware vengono pianificate sui nodi NUMA.

Per creare una VM NUMA-aware:

  1. Segui le istruzioni per creare una VM da un manifest.

    Utilizza le seguenti impostazioni compute per configurare la VM in modo che sia compatibile con NUMA:

    • spec.compute.guaranteed: imposta guaranteed su true. Con questa impostazione, il pod virt-launcher è configurato per essere inserito nella classe Qualità del servizio (QoS) garantita di Kubernetes.

    • spec.compute.advancedCompute:

      • dedicatedCPUPlacement: imposta dedicatedCPUPlacement su true. Questa impostazione blocca le CPU virtuali alle CPU fisiche del nodo.
      • hugePageSize: imposta hugePageSize su 2Mi o 1Gi per specificare la dimensione delle pagine enormi da utilizzare per la VM, 2 mebibyte o 1 gibibyte.
      • numaGuestMappingPassthrough: includi una struttura vuota ({}) per questa impostazione. Questa impostazione stabilisce l'affinità NUMA in modo che la VM venga pianificata solo sui nodi NUMA.

    Il seguente manifest VirtualMachine di esempio mostra come potrebbe essere una configurazione VM consapevole di 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