Konfigurasi VM berbasis NUMA

Dokumen ini menjelaskan cara mengonfigurasi cluster dan VM untuk mendukung performa dan workload berlatensi rendah, dengan efisiensi komputasi {i>non-uniform memory access <i}(NUMA). Ada petunjuk untuk menyesuaikan Kubernetes setelan untuk node cluster. Dokumen ini juga berisi petunjuk untuk mengonfigurasi Mesin Virtual (VM) dengan afinitas NUMA sehingga dapat dijadwalkan dan memanfaatkan node NUMA.

Dengan NUMA-aware VM, semua komunikasi dalam VM bersifat lokal ke NUMA {i>node<i}. VM berbasis NUMA menghindari transaksi data ke dan dari jarak jauh resource yang dapat menurunkan performa VM.

Konfigurasi node untuk menggunakan NUMA

Bagian berikut ini menjelaskan cara mengonfigurasi Kubernetes penting untuk menyesuaikan node dan memastikan node tersebut dapat menjadwalkan NUMA-aware container. NUMA node ini disesuaikan untuk mengoptimalkan performa CPU dan memori. Ikuti petunjuk untuk setiap node yang ingin menjalankan NUMA-aware VM.

Mengupdate konfigurasi kubelet

Sebagai bagian dari konfigurasi node untuk mendukung NUMA afinitas node, Anda harus buat perubahan berikut pada konfigurasi kubelet:

  • Mengaktifkan CPU Manager dengan kebijakan static
  • Mengaktifkan Memory Manager dengan kebijakan Static
  • Mengaktifkan pengelola Topologi dengan topologi restricted

Untuk mengonfigurasi kubelet pada worker node:

  1. Temukan file kubelet pada node pekerja 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 objek kosong KUBELET_EXTRA_ARGS="".

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

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
    
  3. Untuk mengaktifkan Memory Manager dengan kebijakan Static, tambahkan Flag --memory-manager-policy=Static ke KUBELET_EXTRA_ARGS="" bagian dari 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 KUBELET_EXTRA_ARGS="" bagian dari 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 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 tanda --reserved-memory di bagian KUBELET_EXTRA_ARGS kubelet hingga 100 mebibyte lebih banyak dari memori yang saat ini dicadangkan memperhitungkan ambang batas penghapusan. Jika tidak ada memori yang dicadangkan, Anda dapat lewati 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 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 informasi selengkapnya tentang setelan kebijakan ini, lihat referensi berikut Dokumentasi Kubernetes:

Mengonfigurasi node untuk menggunakanlargepages

Setelah mengaktifkan Pengelola Memori dengan kebijakan Static, Anda dapat menambahkan halaman besar untuk lebih meningkatkan performa beban kerja container pada NUMA node Anda. Halaman besar, seperti namanya, memungkinkan Anda menentukan halaman memori yang lebih besar daripada standar 4 kibibyte (KiB). Runtime VM di GDC mendukung 2 mebibyte (MiB) dan 1 gibibyte (GiB). Anda dapat mengatur laman yang sangat besar untuk sebuah {i>node<i} saat runtime, atau saat mesin node melakukan booting. Sebaiknya Anda mengonfigurasi halaman besar di setiap node tempat Anda ingin menjalankan NUMA VM yang sadar.

  1. Untuk mengkonfigurasi jumlah halaman besar dengan ukuran tertentu pada node NUMA Anda di gunakan perintah berikut:

    echo HUGEPAGE_QTY > \
        /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepages
    

    Ganti kode berikut:

    • HUGEPAGE_QTY: jumlah sangat besar untuk mengalokasikan ukuran yang ditentukan.

    • NUMA_NODE: node NUMA, seperti sebagai node0, tempat Anda mengalokasikan halaman besar.

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

Mengonfigurasi VM untuk menggunakan node NUMA

Setelah node cluster Anda disesuaikan untuk NUMA, Anda dapat membuat NUMA VM yang sadar. NUMA VM yang mendukung dijadwalkan di NUMA node.

Untuk membuat NUMA-aware VM:

  1. Ikuti petunjuk untuk membuat VM dari manifes.

    Gunakan setelan compute berikut untuk mengonfigurasi VM Anda agar peka NUMA:

    • spec.compute.guaranteed: Setel guaranteed ke true. Dengan pengaturan ini, Pod virt-launcher dikonfigurasi untuk ditempatkan di Kubernetes Class Kualitas Layanan (QoS) dijamin.

    • spec.compute.advancedCompute:

      • dedicatedCPUPlacement: Setel dedicatedCPUPlacement ke true. Ini mengatur pin CPU virtual ke CPU fisik dari {i>node<i}.
      • hugePageSize: Tetapkan hugePageSize ke 2Mi atau 1Gi untuk menentukan ukuran halaman yang sangat besar untuk digunakan VM Anda, 2 mebibyte atau 1 gibibyte.
      • numaGuestMappingPassthrough: Sertakan struktur kosong ({}) untuk setelan ini. Setelan ini menetapkan afinitas NUMA sehingga VM Anda dijadwalkan di NUMA node saja.

    Contoh manifes VirtualMachine berikut menunjukkan bagaimana VM yang peka konfigurasinya mungkin terlihat:

    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