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 non uniforme alla memoria (NUMA). Sono presenti istruzioni per l'ottimizzazione delle impostazioni di Kubernetes per i nodi cluster. Questo documento include anche le istruzioni per configurare le macchine virtuali (VM) con affinità NUMA in modo che vengano pianificate e sfruttano i nodi NUMA.
Con una VM NUMA-aware, tutte le comunicazioni all'interno della VM sono locali rispetto al nodo NUMA. La VM sensibile a NUMA evita le transazioni di dati da e verso risorse remote che possono ridurre le prestazioni della VM.
Configura i nodi per utilizzare NUMA
Le seguenti sezioni descrivono come configurare i componenti critici di Kubernetes per ottimizzare il nodo e assicurarti che possa pianificare container NUMA-aware. Questi NUMA nodi sono ottimizzati per ottimizzare le prestazioni di CPU e memoria. Segui le istruzioni per ciascun nodo su cui vuoi eseguire VM NUMA-aware.
aggiorna la configurazione kubelet
Nell'ambito della configurazione del nodo per supportare l'affinità dei nodi NUMA, devi apportare le seguenti modifiche alla configurazione del kubelet:
- Abilita Gestione CPU con un criterio
static
- Abilita Gestione memoria con un criterio
Static
- Abilita il gestore della topologia con la topologia
restricted
Per configurare kubelet sul nodo worker:
Individua il file
kubelet
sul tuo nodo worker e aprilo per la modifica:edit /etc/default/kubelet
Se non vedi il file
kubelet
, crealo con questo comando:echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubelet
Questo comando crea il file
kubelet
con una sezioneKUBELET_EXTRA_ARGS=""
vuota.Per abilitare il gestore CPU con un criterio
static
, aggiungi il flag--cpu-manager-policy=static
alla sezioneKUBELET_EXTRA_ARGS=""
del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Per abilitare il Gestore memoria con un criterio
Static
, aggiungi il flag--memory-manager-policy=Static
alla sezioneKUBELET_EXTRA_ARGS=""
del file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Per abilitare Topology Manager con un criterio
restricted
, aggiungi il flag--topology-manager-policy=restricted
alla 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.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.Imposta il flag
--reserved-memory
nella sezioneKUBELET_EXTRA_ARGS
del filekubelet
su 100 mebibyte in più rispetto alla memoria attualmente riservata per tenere conto della soglia di eliminazione. Se non c'è una memoria riservata, puoi saltare questo passaggio.Ad esempio, con la memoria riservata
3470Mi
dell'esempio nel passaggio precedente, prenoti3570Mi
di 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_state
Riavvia kubelet:
systemctl start kubelet
Per ulteriori informazioni su queste impostazioni dei criteri, consulta la seguente documentazione di Kubernetes:
- Criteri di gestione della CPU
- Configurazione del Gestore memoria
- Criterio limitato di Topology Manager
Configura il nodo per utilizzare enormi pagine
Dopo aver abilitato Memory Manager con il criterio Static
, puoi aggiungere enormi pagine per migliorare ulteriormente le prestazioni dei carichi di lavoro dei container sui tuoi nodi NUMA.
Hugepages, come suggerisce il nome, ti consente di specificare le pagine di memoria che sono più grandi dei 4 kibibyte (KiB) standard. Il runtime VM su GDC supporta
2 mebibyte (MiB) e 1 gibibyte (GiB) Hugepages. Puoi impostare enormi pagine
per un nodo in fase di runtime o durante l'avvio. Ti consigliamo di configurare enormi pagine su ciascun nodo su cui vuoi eseguire VM sensibili alle NUMA.
Per configurare il numero di pagine enormi di una dimensione specifica sul nodo NUMA al momento del runtime, 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 hugepages da allocare della dimensione specificata.NUMA_NODE
: il nodo NUMA, ad esempionode0
, a cui stai allocando enormi pagine.HUGEPAGE_SIZE
: la dimensione delle pagine enormi in kibibyte,2048
(2 MiB) o1048576
(1 GiB).
Configura una VM per utilizzare il nodo NUMA
Dopo che i nodi del cluster sono ottimizzati per NUMA, puoi creare VM sensibili a NUMA. Le VM NUMA-aware sono pianificate su nodi NUMA.
Per creare una VM NUMA-aware:
Segui le istruzioni per creare una VM da un manifest.
Utilizza le seguenti impostazioni di
compute
per configurare la tua VM in modo che sia NUMA-aware:spec.compute.guaranteed
: impostaguaranteed
sutrue
. Con questa impostazione, il podvirt-launcher
viene configurato per essere inserito nella classe QoS (Qualità del servizio) garantita da Kubernetes.spec.compute.advancedCompute
:dedicatedCPUPlacement
: impostadedicatedCPUPlacement
sutrue
. Questa impostazione fissa le CPU virtuali alle CPU fisiche del nodo.hugePageSize
: impostahugePageSize
su2Mi
o1Gi
per specificare la dimensione delle pagine grandi che la VM utilizzerà, 2 mebibyte o 1 gibibyte.numaGuestMappingPassthrough
: includi una struttura vuota ({}
) per questa impostazione. Questa impostazione stabilisce l'affinità NUMA in modo che la VM sia pianificata solo su nodi NUMA.
Il seguente manifest di macchina virtuale di esempio mostra l'aspetto di una configurazione di VM sensibile a 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