Configura i parametri del kernel per AlloyDB Omni su Kubernetes

Questa pagina fornisce informazioni sulla configurazione dei nodi Kubernetes che ospitano i cluster di database AlloyDB Omni per le prestazioni ottimali dell'operatore Kubernetes AlloyDB Omni e del motore del database AlloyDB Omni.

La configurazione dei parametri del kernel consente ad AlloyDB Omni di utilizzare in modo più efficiente la memoria di sistema e le risorse di I/O durante la gestione di workload elevati.

Prerequisito

Prima di iniziare, assicurati che i tuoi nodi Kubernetes eseguano il kernel Linux 6.1 o versioni successive, in particolare un kernel che supporti i flag MADV_COLLAPSE e MADV_POPULATE_WRITE. Per ulteriori informazioni su questi flag, consulta la documentazione di madwise Linux.

La tabella seguente elenca i parametri del kernel richiesti e i relativi valori corrispondenti per i nodi Kubernetes che eseguono pod di cluster di database:

File Valore
/sys/kernel/mm/transparent_hugepage/shmem_enabled
Per informazioni sulla memoria condivisa, consulta Supporto di pagine enormi trasparenti
within_size o always
/proc/sys/vm/max_map_count
Per informazioni sul numero di aree di mappatura della memoria che un processo può creare, consulta la documentazione per /proc/sys/vm
Maggiore o uguale a 1073741824

Per configurare i parametri del kernel sui nodi Kubernetes utilizzando un DaemonSet, segui questi passaggi:

  1. Applica le etichette ai nodi in cui prevedi di eseguire i cluster di database seguendo le istruzioni riportate in Aggiungere un'etichetta a un nodo.

  2. Per impostare i parametri del kernel sui nodi etichettati come LABEL_KEY=LABEL_VALUE, crea un 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
    

    Sostituisci quanto segue:

    • DS_NAMESPACE: lo spazio dei nomi in cui vuoi eseguire il deployment del DaemonSet, ad esempio default.
    • LABEL_KEY: l'identificatore dell'etichetta, ad esempio workload.
    • LABEL_VALUE: i dati associati all'identificatore dell'etichetta, ad esempio database.
    • INIT_IMAGE: il nome dell'immagine utilizzata per il contenitore di inizializzazione.
    • MAX_MAP_COUNT: il numero massimo di aree di mappa di memoria che un processo può creare, ad esempio 1073741824.
    • CONTAINER_NAME: il nome del contenitore principale, ad esempio main.
    • CONTAINER_IMAGE: il nome dell'immagine utilizzata per il contenitore principale, ad esempio latest.
  3. Dopo aver eseguito il deployment del DaemonSet, per verificare che tutti i pod nel cluster Kubernetes siano nello stato Running e che tu abbia un pod per ogni nodo con l'etichetta LABEL_KEY=LABEL_VALUE, utilizza il seguente comando:

    kubectl get pods -l LABEL_KEY=LABEL_VALUE
    

    Un esempio di output è il seguente:

    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. Per verificare che il flag del kernel sia stato applicato correttamente, per ogni pod identificato dopo il deployment del DaemonSet, esegui il seguente comando:

    kubectl logs POD_NAME
    

    Sostituisci POD_NAME con il nome del pod di cui vuoi esaminare i log.

    Un esempio di output è il seguente:

    always [within_size] advise never deny force
    

Per eseguire il deployment di cluster di database sui nodi Kubernetes con i parametri del kernel consigliati, aggiungi una sezione nodeAffinity a una delle seguenti sezioni del manifest del cluster di database:

  • primarySpec.schedulingConfig per le istanze principali
  • spec.schedulingConfig per le istanze del pool di lettura
      nodeaffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"

Per ulteriori informazioni sull'esecuzione di cluster di database su nodi Kubernetes specifici, consulta Assegnare nodi a un cluster di database utilizzando la pianificazione.

Verificare l'applicazione dei parametri del kernel

Per verificare che i parametri del kernel vengano applicati ai pod di database:

  1. Se l'alta disponibilità è abilitata, in particolare spec.availability.numberOfStandbys è impostato su un valore maggiore di zero, verifica che la risorsa personalizzata del database mostri DBClusterReady nella colonna DBCLUSTERPHASE e True nella colonna HAREADYSTATUS.

    kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
    

    Sostituisci quanto segue:

    • DBCLUSTER_NAME: il nome del cluster di database che verifichi.
    • DBCLUSTER_NAMESPACE: il nome dello spazio dei nomi specifico in cui risiede il cluster di database.

    Un esempio di output è il seguente:

    NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
    dbcluster-sample   10.29.21.240      Ready          DBClusterReady   True            Ready
    
  2. Elenca i pod Kubernetes che appartengono al cluster di database:

    kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
    
  3. Per controllare le informazioni sulla memoria condivisa, esegui il seguente comando:

    kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
    
  4. L'output deve contenere numeri diversi da zero in tutte le voci.

    Un esempio di output è il seguente:

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

    Se in una delle voci viene visualizzato 0 kB, riavvia il pod corrispondente:

    kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
    
  5. Ripeti i passaggi da 1 a 5 quando il pod è nello stato Running.