L'accesso alla memoria non uniforme (NUMA) consente di supportare workload ad alte prestazioni e a bassa latenza su cluster e macchine virtuali (VM). L'ottimizzazione delle impostazioni di Kubernetes sui nodi del cluster e la configurazione delle VM con affinità NUMA contribuiscono a garantire che i workload vengano pianificati direttamente sui nodi NUMA.
In una VM che supporta NUMA, tutte le comunicazioni rimangono locali nel nodo NUMA. Questa architettura impedisce i trasferimenti di dati remoti che possono ridurre le prestazioni.
Configura i nodi per l'utilizzo di NUMA
Le sezioni seguenti descrivono come configurare i componenti Kubernetes critici per ottimizzare il nodo e assicurarsi che possa pianificare container che supportano NUMA. Questi nodi NUMA sono ottimizzati per migliorare le prestazioni della CPU e della memoria. Segui le istruzioni per ogni nodo su cui vuoi eseguire VM che supportano NUMA.
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:
- Abilita CPU Manager con una policy
static - Attiva Memory Manager con una policy
Static - Attiva il gestore della topologia con la topologia
restricted
Per configurare kubelet sul nodo worker:
Individua il file
kubeletsul nodo worker e aprilo per modificarlo:edit /etc/default/kubeletSe non vedi il file
kubelet, crealo con il seguente comando:echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubeletQuesto comando crea il file
kubeletcon una sezioneKUBELET_EXTRA_ARGS=""vuota.Per attivare CPU Manager con una policy
static, aggiungi il flag--cpu-manager-policy=staticalla sezioneKUBELET_EXTRA_ARGS=""del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Per attivare Gestione della memoria con una policy
Static, aggiungi il flag--memory-manager-policy=Staticalla sezioneKUBELET_EXTRA_ARGS=""del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Per attivare Topology Manager con una policy
restricted, aggiungi il flag--topology-manager-policy=restrictedalla sezioneKUBELET_EXTRA_ARGS=""del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
Controlla la quantità attuale di memoria prenotata da Google Distributed Cloud:
cat /var/lib/kubelet/kubeadm-flags.envL'output dovrebbe essere simile all'esempio 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=3470Miindica che Google Distributed Cloud ha riservato 3470 mebibyte di memoria sul nodo.Imposta il flag
--reserved-memorynella sezioneKUBELET_EXTRA_ARGSdel filekubeletsu un valore superiore di 100 mebibyte rispetto alla memoria attualmente prenotata per tenere conto della soglia di espulsione. Se non è presente memoria prenotata, puoi saltare questo passaggio.Ad esempio, con la memoria prenotata di
3470Midell'esempio nel passaggio precedente, prenoti3570Midi memoria nel filekubelet:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
Rimuovi i file di stato della CPU e della memoria dalla directory
/var/lib:rm /var/lib/cpu_manager_state rm /var/lib/memory_manager_stateRiavvia kubelet:
systemctl start kubelet
Per ulteriori informazioni su queste impostazioni delle policy, consulta la seguente documentazione di Kubernetes:
Configura il nodo per l'utilizzo di hugepage
Dopo aver attivato Gestore della memoria con la policy Static, puoi aggiungere
hugepage per migliorare ulteriormente le prestazioni del workload dei container sui nodi NUMA.
Le pagine Huge, come suggerisce il nome, consentono di specificare pagine di memoria più grandi
rispetto ai 4 kibibyte (KiB) standard. VM Runtime on GDC supporta hugepage da 2 mebibyte (MiB) e 1 gibibyte (GiB). Puoi impostare hugepage per un nodo in fase di runtime o all'avvio della macchina nodo. Ti consigliamo di configurare
le hugepage su ogni nodo su cui vuoi eseguire VM che supportano NUMA.
Per configurare il numero di hugepage di una dimensione specifica sul nodo NUMA in fase di runtime, utilizza il seguente comando:
echo HUGEPAGE_QTY > \ /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepagesSostituisci quanto segue:
HUGEPAGE_QTY: il numero di hugepage da allocare della dimensione specificata.NUMA_NODE: il nodo NUMA, ad esempionode0, a cui stai allocando le hugepage.HUGEPAGE_SIZE: le dimensioni delle hugepage in kibibyte,2048(2 MiB) o1048576(1 GiB).
Configura una VM per l'utilizzo del nodo NUMA
Una volta ottimizzati i nodi del cluster per NUMA, puoi creare VM che supportano NUMA. Le VM NUMA-aware sono pianificate sui nodi NUMA.
Per creare una VM che supporta NUMA:
Segui le istruzioni per creare una VM da un manifest.
Utilizza le seguenti impostazioni
computeper configurare la VM in modo che sia sensibile a NUMA:spec.compute.guaranteed: impostaguaranteedsutrue. Con questa impostazione, il podvirt-launcherè configurato per essere inserito nella classe Quality of Service (QoS) garantita di Kubernetes.spec.compute.advancedCompute:dedicatedCPUPlacement: impostadedicatedCPUPlacementsutrue. Questa impostazione assegna le CPU virtuali alle CPU fisiche del nodo.hugePageSize: impostahugePageSizesu2Mio1Giper specificare la dimensione delle hugepage che la VM deve utilizzare, 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 esempio di manifest VirtualMachine mostra come potrebbe essere una configurazione di VM NUMA-aware:
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