Questo documento descrive come configurare i cluster e le VM per supportare carichi di lavoro ad alte prestazioni e a bassa latenza con le efficienze di calcolo dell'accesso alla memoria non uniforme (NUMA). Esistono 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 l'affinità NUMA in modo che vengano pianificate e possano sfruttare i NUMA nodi.
Con una VM sensibile a NUMA, tutta la comunicazione all'interno della VM è locale rispetto al nodo NUMA. La VM sensibile a NUMA evita le transazioni di dati da e verso risorse remote che possono ridurre le prestazioni delle VM.
Configura i nodi per l'utilizzo di NUMA
Le seguenti sezioni descrivono come configurare i componenti critici di Kubernetes per ottimizzare il nodo e assicurarsi 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 sensibili a NUMA.
Aggiorna la configurazione kubelet
Come parte della configurazione dei nodi per supportare l'affinità dei nodi NUMA, devi apportare le seguenti modifiche alla configurazione kubelet:
- Abilita gestore CPU con un criterio
static
- Attiva Gestione memoria con un criterio
Static
- Abilita Topology Manager con la topologia
restricted
Per configurare kubelet sul tuo nodo worker:
Individua il file
kubelet
sul nodo worker e aprilo per modificarlo:edit /etc/default/kubelet
Se non vedi il file
kubelet
, crealo con il seguente 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 Gestione 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 attivare 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 GKE su Bare Metal:
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 GKE su Bare Metal 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 all'attuale memoria riservata per tenere conto della soglia di eliminazione. Se non è presente alcuna memoria riservata, puoi saltare questo passaggio.Ad esempio, con la memoria riservata di
3470Mi
dell'esempio nel passaggio precedente, riservi3570Mi
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 della CPU e della 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 di Gestore memoria
- Criterio limitato di Topology Manager
Configura il nodo per l'uso digrandi pagine
Dopo aver abilitato il Gestore memoria con il criterio Static
, puoi aggiungere grandi pagine per migliorare ulteriormente le prestazioni dei carichi di lavoro dei container sui nodi NUMA.
Largepages, come suggerisce il nome, ti consente di specificare pagine di memoria più grandi
dei 4 kibibyte (KiB) standard. Il runtime VM su Google Distributed Cloud supporta enormi pagine da 2 mebibyte (MiB) e 1 gibibyte (GiB). Puoi impostare grandi pagine per un nodo
in fase di runtime o per l'avvio della macchina nodo. Ti consigliamo di configurare pagine molto grandi su ciascun nodo in cui vuoi eseguire VM sensibili a NUMA.
Per configurare il numero di pagine enormi di dimensioni specifiche sul nodo NUMA in fase di runtime, utilizza il comando seguente:
echo HUGEPAGE_QTY > \ /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepages
Sostituisci quanto segue:
HUGEPAGE_QTY
: il numero di pagine enormi da allocare delle dimensioni specificate.NUMA_NODE
: il nodo NUMA, ad esempionode0
, a cui stai allocando grandipagine.HUGEPAGE_SIZE
: la dimensione delle paginegiganti in kibibyte,2048
(2 MiB) o1048576
(1 GiB).
Configura una VM per utilizzare il nodo NUMA
Una volta che i nodi del cluster sono ottimizzati per NUMA, puoi creare VM sensibili a NUMA. Le VM sensibili a NUMA sono pianificate su NUMA nodi.
Per creare una VM sensibile a NUMA:
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 compatibile con NUMA:spec.compute.guaranteed
: impostaguaranteed
sutrue
. Con questa impostazione, il podvirt-launcher
è configurato per essere inserito nella classe Quality of Service (QoS) 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 le dimensioni grandi delle pagine da utilizzare per la VM, ovvero 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 su nodi NUMA.
Il seguente manifest VirtualMachine di esempio mostra l'aspetto di una configurazione VM con riconoscimento 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