Neste documento, descrevemos como configurar clusters e VMs para oferecer suporte a cargas de trabalho de alto desempenho e baixa latência com a eficiência de computação do acesso à memória não uniforme (NUMA, na sigla em inglês). Há instruções sobre como ajustar as configurações do Kubernetes para nós de cluster. Este documento também inclui instruções para configurar máquinas virtuais (VMs) com afinidade de NUMA para que elas sejam programadas e usem os nós NUMA.
Com uma VM compatível com NUMA, toda a comunicação dentro da VM é local para o nó NUMA. A VM compatível com NUMA evita transações de dados de e para recursos remotos que podem prejudicar o desempenho da VM.
Configurar nós para usar NUMA
As seções a seguir descrevem como configurar os componentes essenciais do Kubernetes para ajustar o nó e garantir que ele possa programar contêineres compatíveis NUMA. Esses nós NUMA são ajustados para otimizar o desempenho da CPU e da memória. Siga as instruções para cada nó em que você quer executar VMs compatíveis NUMA.
Atualizar a configuração do Kubelet
Como parte da configuração do nó para aceitar a afinidade de nó NUMA, é necessário fazer as seguintes alterações na configuração do kubelet:
- Ativar o gerenciador de CPU com uma política
static - Ativar o gerenciador de memória com uma política
Static - Ativar o gerenciador de topologia com uma topologia
restricted
Para configurar o kubelet no nó de trabalho, faça o seguinte:
Localize o arquivo
kubeletno nó de trabalho e abra-o para edição:edit /etc/default/kubeletSe você não vir o arquivo
kubelet, crie-o com o seguinte comando:echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubeletEsse comando cria o arquivo
kubeletcom uma seçãoKUBELET_EXTRA_ARGS=""vazia.Para ativar o Gerenciador de CPU com uma política
static, adicione a sinalização--cpu-manager-policy=staticà seçãoKUBELET_EXTRA_ARGS=""do arquivo:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Para ativar o Gerenciador de memória com uma política
Static, adicione a sinalização--memory-manager-policy=Staticà seçãoKUBELET_EXTRA_ARGS=""do arquivo:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Para ativar o Gerenciador de topologia com uma política
restricted, adicione a sinalização--topology-manager-policy=restrictedà seçãoKUBELET_EXTRA_ARGS=""do arquivo: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.envA saída será semelhante a esta:
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 configuração
--kube-reserved=cpu=100m,memory=3470Miindica que o Google Distributed Cloud reservou 3.470 mebibytes de memória no nó.Defina a sinalização
--reserved-memoryna seçãoKUBELET_EXTRA_ARGSdo arquivokubeletcomo 100 mebibytes a mais da memória reservada atual para considerar o limite de remoção. Se não houver memória reservada, pule esta etapa.Por exemplo, com a memória reservada de
3470Mido exemplo na etapa anterior, você reserva3570Mide memória no arquivokubelet:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
Remova arquivos de estado de CPU e memória do diretório
/var/lib:rm /var/lib/cpu_manager_state rm /var/lib/memory_manager_stateReinicie o kubelet:
systemctl start kubelet
Para mais informações sobre essas configurações de política, consulte a seguinte documentação do Kubernetes:
- Políticas de gerenciamento de CPU
- Configuração do gerenciador de memória
- Política restrita do gerenciador de topologia
Configurar o nó para usar páginas grandes
Depois de ativar o gerenciador de memória com a política Static, você pode adicionar
páginas grandes para melhorar ainda mais o desempenho da carga de trabalho do contêiner nos nós NUMA.
As páginas grandes, como o nome sugere, permitem especificar páginas de memória
maiores que o padrão de 4 kibibyte (KiB). O ambiente de execução de VM no GDC é compatível com páginas enormes de 2 mebibytes (MiB) e 1 gibibyte (GiB). É possível definir páginas grandes para um nó
no momento da execução ou para quando a máquina do nó for inicializada. Recomendamos que você configure grandes páginas em cada nó em que quiser executar VMs compatíveis com NUMA.
Para configurar o número de páginas grandes de um tamanho específico no nó NUMA no ambiente de execução, use o seguinte comando:
echo HUGEPAGE_QTY > \ /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepagesSubstitua:
HUGEPAGE_QTY: o número de páginas a serem alocadas para o tamanho especificado.NUMA_NODE: o nó NUMA, comonode0, ao qual você está alocando páginas grandes.HUGEPAGE_SIZE: o tamanho das páginas grandes em kibibytes,2048(2 MiB) ou1048576(1 GiB).
Configurar uma VM para usar o nó NUMA
Depois que os nós do cluster forem ajustados para NUMA, será possível criar VMs com reconhecimento de NUMA. As VMs com reconhecimento de NUMA são programadas em nós NUMA.
Para criar uma VM compatível com NUMA:
Siga as instruções para criar uma VM usando um manifesto.
Use as seguintes configurações de
computepara configurar a VM compatível com NUMA:spec.compute.guaranteed: definaguaranteedcomotrue. Com essa configuração, ovirt-launcherpod está configurado para ser colocado na classe de qualidade de serviço (QoS) do Kubernetes.spec.compute.advancedCompute:dedicatedCPUPlacement: definadedicatedCPUPlacementcomotrue. Essa configuração fixa as CPUs virtuais nas CPUs físicas do nó.hugePageSize: definahugePageSizecomo2Miou1Gipara especificar o tamanho das páginas grandes para a VM usar, 2 mebibytes ou 1 gibibyte.numaGuestMappingPassthrough: inclua uma estrutura vazia ({}) para essa configuração. Essa configuração estabelece a afinidade de NUMA para que a VM seja programada apenas em nós NUMA.
O exemplo de manifesto VirtualMachine a seguir mostra como pode ser 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