Este documento descreve como configurar clusters e VMs para suportar cargas de trabalho de alto desempenho e baixa latência com as eficiências de computação do acesso à memória não uniforme (NUMA). Existem instruções para ajustar as definições do Kubernetes para os nós do cluster. Este documento também inclui instruções para configurar máquinas virtuais (VMs) com afinidade NUMA para que sejam agendadas e tirem partido dos nós NUMA.
Com uma VM compatível com NUMA, toda a comunicação na VM é local para o nó NUMA. A VM compatível com NUMA evita transações de dados de e para recursos remotos que podem degradar o desempenho da VM.
Configure nós para usar NUMA
As secções seguintes descrevem como configurar os componentes críticos do Kubernetes para otimizar o nó e garantir que consegue agendar contentores compatíveis com NUMA. Estes nós NUMA são ajustados para otimizar o desempenho da CPU e da memória. Siga as instruções para cada nó no qual quer executar VMs compatíveis com NUMA.
Atualize a configuração do kubelet
Como parte da configuração do nó para suportar a afinidade do nó NUMA, tem de fazer as seguintes alterações na configuração do kubelet:
- Ative o CPU Manager com uma política
static
- Ative o Gestor de memória com uma política
Static
- Ative o gestor de topologia com a topologia
restricted
Para configurar o kubelet no nó trabalhador:
Localize o ficheiro
kubelet
no nó de trabalho e abra-o para edição:edit /etc/default/kubelet
Se não vir o ficheiro
kubelet
, crie-o com o seguinte comando:echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubelet
Este comando cria o ficheiro
kubelet
com uma secçãoKUBELET_EXTRA_ARGS=""
vazia.Para ativar o CPU Manager com uma política
static
, adicione a flag--cpu-manager-policy=static
à secçãoKUBELET_EXTRA_ARGS=""
do ficheiro:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Para ativar o Memory Manager com uma política
Static
, adicione a flag--memory-manager-policy=Static
à secçãoKUBELET_EXTRA_ARGS=""
do ficheiro:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Para ativar o Topology Manager com uma política
restricted
, adicione a flag--topology-manager-policy=restricted
à secçãoKUBELET_EXTRA_ARGS=""
do ficheiro:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
Verifique a quantidade atual de memória reservada pelo Google Distributed Cloud:
cat /var/lib/kubelet/kubeadm-flags.env
O resultado deve ter o seguinte aspeto:
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"
A definição
--kube-reserved=cpu=100m,memory=3470Mi
indica que o Google Distributed Cloud reservou 3470 mebibytes de memória no nó.Defina a flag
--reserved-memory
na secçãoKUBELET_EXTRA_ARGS
do ficheirokubelet
para 100 mebibytes acima da memória reservada atual para ter em conta o limite de despejo. Se não houver memória reservada, pode ignorar este passo.Por exemplo, com a memória reservada de
3470Mi
do exemplo no passo anterior, reserva3570Mi
de memória no ficheirokubelet
:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
Remova os ficheiros de estado da CPU e da memória do diretório
/var/lib
:rm /var/lib/cpu_manager_state rm /var/lib/memory_manager_state
Reinicie o kubelet:
systemctl start kubelet
Para mais informações sobre estas definições de políticas, consulte a seguinte documentação do Kubernetes:
Configure o nó para usar páginas grandes
Depois de ativar o Memory Manager com a política Static
, pode adicionar páginas enormes para melhorar ainda mais o desempenho da carga de trabalho do contentor nos seus nós NUMA.
As páginas enormes, como o nome sugere, permitem especificar páginas de memória maiores do que os 4 kibibytes (KiB) padrão. O tempo de execução da VM no GDC suporta páginas grandes de 2 mebibytes (MiB) e 1 gibibyte (GiB). Pode definir páginas grandes para um nó
em tempo de execução ou para quando a máquina do nó arranca. Recomendamos que configure as páginas enormes em cada nó no qual quer executar VMs compatíveis com NUMA.
Para configurar o número de páginas enormes de um tamanho específico no seu nó NUMA em tempo de execução, use o seguinte comando:
echo HUGEPAGE_QTY > \ /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepages
Substitua o seguinte:
HUGEPAGE_QTY
: o número de páginas enormes a atribuir do tamanho especificado.NUMA_NODE
: o nó NUMA, comonode0
, ao qual está a atribuir páginas grandes.HUGEPAGE_SIZE
: o tamanho das páginas enormes em kibibytes,2048
(2 MiB) ou1048576
(1 GiB).
Configure uma VM para usar o nó NUMA
Depois de os nós do cluster serem otimizados para NUMA, pode criar VMs compatíveis com NUMA. As VMs compatíveis com NUMA são agendadas em nós NUMA.
Para criar uma VM compatível com NUMA:
Siga as instruções para criar uma VM a partir de um manifesto.
Use as seguintes
compute
definições para configurar a VM de modo a ter em conta a NUMA:spec.compute.guaranteed
: definaguaranteed
comotrue
. Com esta definição, o podvirt-launcher
é configurado para ser colocado na classe de Qualidade de Serviço (QoS) garantida do Kubernetes.spec.compute.advancedCompute
:dedicatedCPUPlacement
: definadedicatedCPUPlacement
comotrue
. Esta definição associa as CPUs virtuais às CPUs físicas do nó.hugePageSize
: definahugePageSize
como2Mi
ou1Gi
para especificar o tamanho das páginas enormes que a sua VM vai usar, 2 mebibytes ou 1 gibibyte.numaGuestMappingPassthrough
: inclua uma estrutura vazia ({}
) para esta definição. Esta definição estabelece a afinidade NUMA para que a sua VM seja agendada apenas em nós NUMA.
O exemplo seguinte do manifesto VirtualMachine mostra o aspeto de uma configuração de VM compatível com 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