Akses memori tidak seragam (NUMA) memungkinkan Anda mendukung workload berperforma tinggi dan berlatensi rendah pada cluster dan virtual machine (VM). Menyesuaikan setelan Kubernetes di node cluster dan mengonfigurasi VM dengan afinitas NUMA membantu memastikan bahwa workload dijadwalkan langsung di node NUMA.
Dalam VM yang mendukung NUMA, semua komunikasi tetap bersifat lokal untuk node NUMA. Arsitektur ini mencegah transfer data jarak jauh yang dapat menurunkan performa.
Mengonfigurasi node agar menggunakan NUMA
Bagian berikut menjelaskan cara mengonfigurasi komponen Kubernetes yang penting untuk menyesuaikan node dan memastikan node dapat menjadwalkan container yang mendukung NUMA. Node NUMA ini disesuaikan untuk mengoptimalkan performa CPU dan memori. Ikuti petunjuk untuk setiap node yang ingin Anda jalankan VM berbasis NUMA.
Memperbarui konfigurasi kubelet
Sebagai bagian dari konfigurasi node untuk mendukung afinitas node NUMA, Anda perlu melakukan perubahan berikut dalam konfigurasi kubelet:
- Mengaktifkan CPU Manager dengan kebijakan
static - Mengaktifkan Pengelola Memori dengan kebijakan
Static - Mengaktifkan Topology manager dengan topologi
restricted
Untuk mengonfigurasi kubelet di worker node Anda:
Temukan file
kubeletdi worker node Anda dan buka untuk mengedit:edit /etc/default/kubeletJika Anda tidak melihat file
kubelet, buat file tersebut dengan perintah berikut:echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubeletPerintah ini akan membuat file
kubeletdengan bagianKUBELET_EXTRA_ARGS=""kosong.Untuk mengaktifkan CPU Manager dengan kebijakan
static, tambahkan flag--cpu-manager-policy=staticke bagianKUBELET_EXTRA_ARGS=""file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Untuk mengaktifkan Pengelola Memori dengan kebijakan
Static, tambahkan flag--memory-manager-policy=Staticke bagianKUBELET_EXTRA_ARGS=""file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Untuk mengaktifkan Topology Manager dengan kebijakan
restricted, tambahkan flag--topology-manager-policy=restrictedke bagianKUBELET_EXTRA_ARGS=""file:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
Periksa jumlah memori saat ini yang dicadangkan oleh Google Distributed Cloud:
cat /var/lib/kubelet/kubeadm-flags.envOutputnya akan terlihat seperti berikut ini:
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"
Setelan
--kube-reserved=cpu=100m,memory=3470Mimenunjukkan bahwa Google Distributed Cloud telah mencadangkan memori sebesar 3.470 mebibyte pada node.Tetapkan flag
--reserved-memorydi bagianKUBELET_EXTRA_ARGSpada filekubeletke 100 mebibyte lebih banyak daripada memori yang dicadangkan saat ini untuk memperhitungkan nilai minimum pengeluaran. Jika tidak ada memori yang dicadangkan, Anda dapat melewati langkah ini.Misalnya, dengan memori yang dicadangkan sebesar
3470Midari contoh pada langkah sebelumnya, Anda mencadangkan memori sebesar3570Midalam filekubelet:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
Hapus file status CPU dan memori dari direktori
/var/lib:rm /var/lib/cpu_manager_state rm /var/lib/memory_manager_stateMulai ulang kubelet:
systemctl start kubelet
Untuk mengetahui informasi selengkapnya tentang setelan kebijakan ini, lihat dokumentasi Kubernetes berikut:
Mengonfigurasi node untuk menggunakan hugepages
Setelah mengaktifkan Memory Manager dengan kebijakan Static, Anda dapat menambahkan
hugepage untuk lebih meningkatkan performa workload container di node NUMA.
Hugepages, seperti namanya, memungkinkan Anda menentukan halaman memori yang lebih besar dari standar 4 kibibyte (KiB). Runtime VM di GDC mendukung hugepage 2 mebibyte (MiB) dan 1 gibibyte (GiB). Anda dapat menetapkan hugepage untuk node
saat runtime, atau saat mesin node melakukan booting. Sebaiknya konfigurasikan
hugepage di setiap node tempat Anda ingin menjalankan VM yang mendukung NUMA.
Untuk mengonfigurasi jumlah hugepage dengan ukuran tertentu pada node NUMA Anda saat runtime, gunakan perintah berikut:
echo HUGEPAGE_QTY > \ /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepagesGanti kode berikut:
HUGEPAGE_QTY: jumlah hugepage yang akan dialokasikan dari ukuran yang ditentukan.NUMA_NODE: node NUMA, sepertinode0, tempat Anda mengalokasikan hugepage.HUGEPAGE_SIZE: ukuran hugepage dalam kibibyte,2048(2 MiB) atau1048576(1 GiB).
Mengonfigurasi VM untuk menggunakan node NUMA
Setelah node cluster disesuaikan untuk NUMA, Anda dapat membuat VM yang mendukung NUMA. VM yang mendukung NUMA dijadwalkan di node NUMA.
Untuk membuat VM yang mendukung NUMA:
Ikuti petunjuk untuk membuat VM dari manifes.
Gunakan setelan
computeberikut untuk mengonfigurasi VM agar mendukung NUMA:spec.compute.guaranteed: Tetapkanguaranteedketrue. Dengan setelan ini, Podvirt-launcherdikonfigurasi untuk ditempatkan di class Quality of Service (QoS) Guaranteed Kubernetes.spec.compute.advancedCompute:dedicatedCPUPlacement: TetapkandedicatedCPUPlacementketrue. Setelan ini menyematkan CPU virtual ke CPU fisik node.hugePageSize: TetapkanhugePageSizeke2Miatau1Giuntuk menentukan ukuran hugepages yang akan digunakan VM Anda, 2 mebibyte atau 1 gibibyte.numaGuestMappingPassthrough: Sertakan struktur kosong ({}) untuk setelan ini. Setelan ini menetapkan afinitas NUMA sehingga VM Anda hanya dijadwalkan di node NUMA.
Manifes VirtualMachine berikut menunjukkan kemungkinan tampilan konfigurasi VM yang mendukung 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