Konfigurasi VM berbasis NUMA

Dokumen ini menjelaskan cara mengonfigurasi cluster dan VM untuk mendukung workload berperforma tinggi dan latensi rendah dengan efisiensi komputasi akses memori tidak seragam (NUMA). Tersedia petunjuk untuk menyesuaikan setelan Kubernetes bagi node cluster. Dokumen ini juga berisi petunjuk untuk mengonfigurasi Mesin Virtual (VM) dengan afinitas NUMA agar dijadwalkan dan memanfaatkan node NUMA.

Dengan VM yang peka NUMA, semua komunikasi dalam VM bersifat lokal ke node NUMA. VM berbasis NUMA menghindari transaksi data ke dan dari resource jarak jauh yang dapat menurunkan performa VM.

Konfigurasi node untuk menggunakan NUMA

Bagian berikut menjelaskan cara mengonfigurasi komponen Kubernetes yang penting untuk menyesuaikan node dan memastikannya dapat menjadwalkan container yang peka terhadap NUMA. NUMA node ini disesuaikan untuk mengoptimalkan performa CPU dan memori. Ikuti petunjuk untuk setiap node yang Anda inginkan untuk menjalankan VM yang peka terhadap NUMA.

Mengupdate konfigurasi kubelet

Sebagai bagian dari konfigurasi node untuk mendukung afinitas node NUMA, Anda perlu membuat perubahan berikut dalam konfigurasi kubelet:

  • Mengaktifkan Pengelola CPU dengan kebijakan static
  • Mengaktifkan Pengelola Memori dengan kebijakan Static
  • Aktifkan pengelola Topologi dengan topologi restricted

Untuk mengonfigurasi kubelet pada node pekerja Anda:

  1. Temukan file kubelet di node pekerja Anda, lalu buka untuk diedit:

    edit /etc/default/kubelet
    

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

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

    Perintah ini membuat file kubelet dengan bagian KUBELET_EXTRA_ARGS="" yang 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 tanda --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 tanda --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 yang saat ini dicadangkan oleh GKE di Bare Metal:

    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 GKE di Bare Metal telah mencadangkan memori sebesar 3.470 mebibyte pada node tersebut.

  6. Tetapkan tanda --reserved-memory di bagian KUBELET_EXTRA_ARGS pada file kubelet menjadi 100 mebibyte lebih besar dari memori yang dicadangkan saat ini untuk memperhitungkan nilai minimum penghapusan. Jika tidak ada memori yang dicadangkan, Anda dapat melewati langkah ini.

    Misalnya, dengan memori 3470Mi yang dicadangkan dari contoh dalam langkah sebelumnya, Anda mencadangkan 3570Mi memori 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 memori dan CPU 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 largepages

Setelah mengaktifkan Pengelola Memori dengan kebijakan Static, Anda dapat menambahkan banyak halaman untuk lebih meningkatkan performa beban kerja container pada node NUMA Anda. Largepages, seperti namanya, memungkinkan Anda menentukan halaman memori yang lebih besar dari 4 kibibyte (KiB) standar. Runtime VM di GDC mendukung halaman besar 2 mebibyte (MiB) dan 1 gibibyte (GiB). Anda dapat menyetel halaman besar untuk node saat runtime, atau saat mesin node melakukan booting. Sebaiknya konfigurasi sejumlah besar halaman di setiap node tempat Anda ingin menjalankan VM yang peka terhadap NUMA.

  1. Untuk mengonfigurasi jumlah halaman besar dengan ukuran tertentu pada node NUMA 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 halaman besar.

    • HUGEPAGE_SIZE: ukuran halaman besar dalam kibibyte, 2048 (2 MiB) atau 1048576 (1 GiB).

Konfigurasi VM untuk menggunakan node NUMA

Setelah node cluster Anda disesuaikan untuk NUMA, Anda dapat membuat VM NUMA-aware. VM NUMA-aware dijadwalkan pada NUMA node.

Untuk membuat VM yang peka terhadap NUMA:

  1. Ikuti petunjuk untuk membuat VM dari manifes.

    Gunakan setelan compute berikut untuk mengonfigurasi VM agar mengenali NUMA:

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

    • spec.compute.advancedCompute:

      • dedicatedCPUPlacement: Tetapkan dedicatedCPUPlacement ke true. Setelan ini akan memasang pin pada CPU virtual ke CPU fisik node.
      • hugePageSize: Tetapkan hugePageSize ke 2Mi atau 1Gi untuk menentukan ukuran halaman besar yang akan digunakan VM Anda, 2 mebibyte atau 1 gibibyte.
      • numaGuestMappingPassthrough: Menyertakan struktur kosong ({}) untuk setelan ini. Setelan ini menetapkan afinitas NUMA sehingga VM Anda dijadwalkan hanya pada node NUMA.

    Contoh manifes VirtualMachine berikut menunjukkan tampilan konfigurasi VM yang peka 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