Mengonfigurasi VM yang kompatibel dengan NUMA

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:

  1. Temukan file kubelet di worker node Anda dan buka untuk mengedit:

    edit /etc/default/kubelet
    

    Jika Anda tidak melihat file kubelet, buat file tersebut dengan perintah berikut:

    echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubelet
    

    Perintah ini akan membuat file kubelet dengan bagian KUBELET_EXTRA_ARGS="" kosong.

  2. Untuk mengaktifkan CPU Manager dengan kebijakan static, tambahkan flag --cpu-manager-policy=static ke bagian KUBELET_EXTRA_ARGS="" file:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
    
  3. Untuk mengaktifkan Pengelola Memori dengan kebijakan Static, tambahkan flag --memory-manager-policy=Static ke bagian KUBELET_EXTRA_ARGS="" file:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
    
  4. Untuk mengaktifkan Topology Manager dengan kebijakan restricted, tambahkan flag --topology-manager-policy=restricted ke bagian KUBELET_EXTRA_ARGS="" file:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
    
  5. Periksa jumlah memori saat ini yang dicadangkan oleh Google Distributed Cloud:

    cat /var/lib/kubelet/kubeadm-flags.env
    

    Outputnya 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=3470Mi menunjukkan bahwa Google Distributed Cloud telah mencadangkan memori sebesar 3.470 mebibyte pada node.

  6. Tetapkan flag --reserved-memory di bagian KUBELET_EXTRA_ARGS pada file kubelet ke 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 3470Mi dari contoh pada langkah sebelumnya, Anda mencadangkan memori sebesar 3570Mi dalam file kubelet:

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
    
  7. Hapus file status CPU dan memori dari direktori /var/lib:

    rm /var/lib/cpu_manager_state
    rm /var/lib/memory_manager_state
    
  8. Mulai 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.

  1. 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_hugepages
    

    Ganti kode berikut:

    • HUGEPAGE_QTY: jumlah hugepage yang akan dialokasikan dari ukuran yang ditentukan.

    • NUMA_NODE: node NUMA, seperti node0, tempat Anda mengalokasikan hugepage.

    • HUGEPAGE_SIZE: ukuran hugepage dalam kibibyte, 2048 (2 MiB) atau 1048576 (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:

  1. Ikuti petunjuk untuk membuat VM dari manifes.

    Gunakan setelan compute berikut untuk mengonfigurasi VM agar mendukung NUMA:

    • spec.compute.guaranteed: Tetapkan guaranteed ke true. Dengan setelan ini, Pod virt-launcher dikonfigurasi untuk ditempatkan di class Quality of Service (QoS) Guaranteed Kubernetes.

    • spec.compute.advancedCompute:

      • dedicatedCPUPlacement: Tetapkan dedicatedCPUPlacement ke true. Setelan ini menyematkan CPU virtual ke CPU fisik node.
      • hugePageSize: Tetapkan hugePageSize ke 2Mi atau 1Gi untuk 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