Mengonfigurasi parameter kernel untuk AlloyDB Omni di Kubernetes

Halaman ini memberikan informasi tentang cara menyiapkan node Kubernetes yang menghosting cluster database AlloyDB Omni untuk performa optimal operator AlloyDB Omni Kubernetes dan mesin database AlloyDB Omni.

Mengonfigurasi parameter kernel memungkinkan AlloyDB Omni menggunakan memori sistem dan resource IO secara lebih efisien saat menangani beban kerja yang berat.

Prasyarat

Sebelum memulai, pastikan node Kubernetes Anda menjalankan kernel Linux 6.1 atau yang lebih tinggi, khususnya kernel yang mendukung flag MADV_COLLAPSE dan MADV_POPULATE_WRITE. Untuk informasi selengkapnya tentang flag ini, lihat dokumentasi madwise Linux.

Tabel berikut mencantumkan parameter kernel yang diperlukan dan nilai yang sesuai untuk node Kubernetes yang menjalankan pod cluster database:

File Nilai
/sys/kernel/mm/transparent_hugepage/shmem_enabled
Untuk informasi tentang memori bersama, lihat Dukungan Hugepage Transparan
within_size atau always
/proc/sys/vm/max_map_count
Untuk mengetahui informasi tentang jumlah area peta memori yang dapat dibuat oleh proses, lihat Dokumentasi untuk /proc/sys/vm
Lebih dari atau sama dengan 1073741824

Untuk mengonfigurasi parameter kernel di node Kubernetes menggunakan DaemonSet, lakukan hal berikut:

  1. Terapkan label ke node tempat Anda berencana menjalankan cluster database menggunakan petunjuk di Menambahkan label ke node.

  2. Untuk menetapkan parameter kernel pada node berlabel LABEL_KEY=LABEL_VALUE, buat DaemonSet:

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: alloydb-omni-kernel-tuning
      namespace: DS_NAMESPACE
    spec:
      selector:
        matchLabels:
          name: alloydb-omni-kernel-tuning
      template:
        metadata:
          labels:
            name: alloydb-omni-kernel-tuning
        spec:
          volumes:
            - name: host-sys
              hostPath:
                path: /sys
          nodeSelector:
            LABEL_KEY: "LABEL_VALUE"
          restartPolicy: Always
          terminationGracePeriodSeconds: 1
          initContainers:
            - name: enable-thp-mmc
              image: INIT_IMAGE
              volumeMounts:
                - name: host-sys
                  mountPath: /sys
              securityContext:
                privileged: true
              command: ["sh", "-c", "sysctl -w vm.max_map_count=MAX_MAP_COUNT && echo within_size >/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
          containers:
            - name: CONTAINER_NAME
              image: CONTAINER_IMAGE
              command: ["watch", "-n", "600", "cat", "/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
    EOF
    

    Ganti kode berikut:

    • DS_NAMESPACE: namespace tempat Anda ingin men-deploy DaemonSet—misalnya, default.
    • LABEL_KEY: ID untuk label—misalnya, workload.
    • LABEL_VALUE: data yang terkait dengan ID untuk label—misalnya, database.
    • INIT_IMAGE: nama image yang digunakan untuk penampung init.
    • MAX_MAP_COUNT: jumlah maksimum area peta memori yang dapat dibuat oleh proses—misalnya, 1073741824.
    • CONTAINER_NAME: nama penampung utama—misalnya, main.
    • CONTAINER_IMAGE: nama image yang digunakan untuk penampung utama—misalnya, latest.
  3. Setelah men-deploy DaemonSet, untuk memverifikasi bahwa semua pod di cluster Kubernetes Anda berada dalam status Running dan Anda memiliki satu pod untuk setiap node dengan label LABEL_KEY=LABEL_VALUE, gunakan perintah berikut:

    kubectl get pods -l LABEL_KEY=LABEL_VALUE
    

    Contoh output-nya terlihat seperti berikut:

    NAME                               READY   STATUS    RESTARTS   AGE
    alloydb-omni-kernel-tuning-2dkwh   1/1     Running   0          22s
    alloydb-omni-kernel-tuning-pgkbj   1/1     Running   0          19s
    
  4. Untuk memverifikasi bahwa flag kernel berhasil diterapkan, untuk setiap pod yang diidentifikasi setelah men-deploy DaemonSet, jalankan perintah berikut:

    kubectl logs POD_NAME
    

    Ganti POD_NAME dengan nama pod yang log-nya ingin Anda periksa.

    Contoh output-nya terlihat seperti berikut:

    always [within_size] advise never deny force
    

Untuk men-deploy cluster database di node Kubernetes dengan parameter kernel yang direkomendasikan, tambahkan bagian nodeAffinity ke salah satu bagian manifes cluster database berikut:

  • primarySpec.schedulingConfig untuk instance utama
  • spec.schedulingConfig untuk instance kumpulan baca
      nodeaffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"

Untuk informasi selengkapnya tentang cara menjalankan cluster database di node Kubernetes tertentu, lihat Menetapkan node ke cluster database menggunakan penjadwalan.

Memverifikasi penerapan parameter kernel

Untuk memverifikasi parameter kernel yang diterapkan ke pod database, lakukan hal berikut:

  1. Jika ketersediaan tinggi diaktifkan, khususnya spec.availability.numberOfStandbys ditetapkan ke nilai yang lebih besar dari nol, pastikan resource kustom database menampilkan DBClusterReady di kolom DBCLUSTERPHASE dan True di kolom HAREADYSTATUS.

    kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
    

    Ganti kode berikut:

    • DBCLUSTER_NAME: nama cluster database yang Anda verifikasi.
    • DBCLUSTER_NAMESPACE: nama namespace tertentu tempat cluster database Anda berada.

    Contoh output-nya terlihat seperti berikut:

    NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
    dbcluster-sample   10.29.21.240      Ready          DBClusterReady   True            Ready
    
  2. Cantumkan pod Kubernetes yang termasuk dalam cluster database:

    kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
    
  3. Untuk memeriksa informasi memori bersama, jalankan perintah berikut:

    kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
    
  4. Output harus berisi angka selain nol di semua entri.

    Contoh output-nya terlihat seperti berikut:

    Shmem:          126255872 kB
    ShmemHugePages: 18403328 kB
    ShmemPmdMapped:  2961408 kB
    

    Jika Anda melihat 0 kB ditampilkan di salah satu entri, mulai ulang pod yang sesuai:

    kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
    
  5. Ulangi langkah 1 hingga 5 setelah pod berada dalam status Running.