Questo documento descrive come configurare cluster e VM per supportare workload ad alte prestazioni e a bassa latenza con l'efficienza di calcolo dell'accesso alla memoria non uniforme (NUMA). Esistono istruzioni per la regolazione delle 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, tutta la comunicazione all'interno della VM è locale 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 della CPU e della memoria. Segui le istruzioni per ogni nodo su cui vuoi eseguire VM compatibili con NUMA.
Aggiorna la configurazione di Kubelet
Nell'ambito della configurazione dei nodi per supportare l'affinità NUMA, devi apportare le seguenti modifiche alla configurazione di kubelet:
- Abilita CPU Manager con una policy
static
- Attiva Memory Manager con un criterio
Static
- Abilita Topology Manager con la topologia
restricted
Per configurare kubelet sul nodo worker:
Individua il file
kubelet
sul nodo di lavoro 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 attivare CPU Manager 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 attivare Memory Manager con una policy
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 una policy
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 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.Imposta il flag
--reserved-memory
nella sezioneKUBELET_EXTRA_ARGS
del filekubelet
su 100 mebibyte in più rispetto alla memoria riservata attuale per tenere conto della soglia di eliminazione. Se non è presente 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 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:
- Norme di gestione della CPU
- Configurazione di Memory Manager
- Norme con limitazioni di Topology Manager
Configura il nodo per l'utilizzo di hugepages
Una volta abilitato Memory Manager con il criterio Static
, puoi aggiungere
hugepages per migliorare ulteriormente il rendimento del carico di lavoro dei container sui nodi NUMA.
Hugepages, come suggerito dal nome, ti consente 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 hugepages per un nodo
in fase di runtime o all'avvio della macchina del nodo. Ti consigliamo di configurare
hugepages 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_hugepages
Sostituisci 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).
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
compute
per configurare la 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 di qualità del servizio (QoS) garantita di Kubernetes.spec.compute.advancedCompute
:dedicatedCPUPlacement
: impostadedicatedCPUPlacement
sutrue
. Questa impostazione blocca le CPU virtuali sulle CPU fisiche del nodo.hugePageSize
: impostahugePageSize
su2Mi
o1Gi
per 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 esempio di manifest VirtualMachine mostra come potrebbe apparire una configurazione della 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