Questo documento descrive come configurare cluster e VM per supportare carichi di lavoro a prestazioni elevate e a bassa latenza con le efficienze di calcolo dell'accesso alla memoria non uniforme (NUMA). Sono disponibili istruzioni per ottimizzare le impostazioni di Kubernetes per i nodi del cluster. Questo documento include anche istruzioni per configurare le macchine virtuali (VM) con affinità NUMA in modo che vengano pianificate e sfruttino i nodi NUMA.
Con una VM compatibile con NUMA, tutte le comunicazioni all'interno della VM sono locali al nodo NUMA. La VM compatibile con NUMA evita le transazioni di dati da e verso risorse remote che possono peggiorare le prestazioni della VM.
Configurare 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 i container compatibili con NUMA. Questi nodi NUMA sono ottimizzati per migliorare le prestazioni di CPU e memoria. Segui le istruzioni per ogni nodo su cui vuoi eseguire VM compatibili con NUMA.
Aggiornare la configurazione di kubelet
Nell'ambito della configurazione del nodo per supportare l'affinità del nodo NUMA, devi apportare le seguenti modifiche alla configurazione di kubelet:
- Abilita CPU Manager con una policy
static - Abilita Memory Manager con una policy
Static - Abilita Topology Manager 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
kubeletfile con una sezioneKUBELET_EXTRA_ARGS=""vuota.Per abilitare CPU Manager con una policy
static, aggiungi il--cpu-manager-policy=staticflag allaKUBELET_EXTRA_ARGS=""sezione del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Per abilitare Memory Manager con una
Staticpolicy, aggiungi il--memory-manager-policy=Staticflag allaKUBELET_EXTRA_ARGS=""sezione del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Per abilitare Topology Manager con una policy
restricted, aggiungi il--topology-manager-policy=restrictedflag allaKUBELET_EXTRA_ARGS=""sezione del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
Controlla la quantità di memoria attualmente riservata da Google Distributed Cloud:
cat /var/lib/kubelet/kubeadm-flags.envL'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=3470Miindica che Google Distributed Cloud ha riservato 3470 mebibyte di memoria sul nodo.Imposta il flag
--reserved-memorynella sezioneKUBELET_EXTRA_ARGSdel filekubeletsu 100 mebibyte in più rispetto alla memoria riservata attuale per tenere conto della soglia di espulsione. Se non è presente memoria riservata, puoi saltare questo passaggio.Ad esempio, con la memoria riservata di
3470Midell'esempio nel passaggio precedente, riserva3570Midi 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 di CPU e 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:
Configurare il nodo per l'utilizzo di hugepage
Dopo aver abilitato Memory Manager con la policy Static, puoi aggiungere hugepage per migliorare ulteriormente le prestazioni dei carichi di lavoro dei container sui nodi NUMA.
Le hugepage, come suggerisce il nome, consentono di specificare pagine di memoria più grandi rispetto ai 4 kibibyte (KiB) standard. VM Runtime su 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 del nodo. Ti consigliamo di configurare hugepage su ogni nodo su cui vuoi eseguire VM compatibili con 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 hugepage.HUGEPAGE_SIZE: la dimensione delle hugepage in kibibyte,2048(2 MiB) o1048576(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 compatibili con NUMA vengono pianificate sui nodi NUMA.
Per creare una VM compatibile con NUMA:
Segui le istruzioni per creare una VM da un manifest.
Utilizza le seguenti impostazioni
computeper configurare la VM in modo che sia compatibile con NUMA:spec.compute.guaranteed: impostaguaranteedsutrue. Con questa impostazione, il podvirt-launcherè configurato per essere inserito nella classe di qualità del servizio (QoS) garantita di Kubernetes garantita di qualità del servizio (QoS).spec.compute.advancedCompute:dedicatedCPUPlacement: impostadedicatedCPUPlacementsutrue. Questa impostazione associa le CPU virtuali alle CPU fisiche del nodo.hugePageSize: impostahugePageSizesu2Mio1Giper specificare la dimensione delle hugepage 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 di VirtualMachine di esempio mostra come potrebbe apparire una configurazione di VM compatibile con 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