Kubernetes 上の AlloyDB Omni のカーネル パラメータを構成する

このページでは、AlloyDB Omni Kubernetes Operator と AlloyDB Omni データベース エンジンのパフォーマンスを最適化するために、AlloyDB Omni データベース クラスタをホストする Kubernetes ノードの設定について説明します。

カーネル パラメータを構成すると、AlloyDB Omni は負荷の高いワークロードを処理するときにシステムメモリと IO リソースをより効率的に使用できます。

前提条件

始める前に、Kubernetes ノードで Linux カーネル 6.1 以降(特に MADV_COLLAPSE フラグと MADV_POPULATE_WRITE フラグをサポートするカーネル)が実行されていることを確認します。これらのフラグの詳細については、Linux madwise のドキュメントをご覧ください。

次の表に、データベース クラスタ Pod を実行する Kubernetes ノードに必要なカーネル パラメータと、それに対応する値を示します。

ファイル
/sys/kernel/mm/transparent_hugepage/shmem_enabled
共有メモリについては、Transparent Huge Page のサポートをご覧ください。
within_size または always
/proc/sys/vm/max_map_count
プロセスが作成できるメモリマップ領域の数については、/proc/sys/vm のドキュメントをご覧ください。
1073741824 以上

DaemonSet を使用して Kubernetes ノードでカーネル パラメータを構成するには、次の操作を行います。

  1. ノードラベルを追加するの手順に沿って、データベース クラスタを実行するノードにラベルを適用します。

  2. LABEL_KEY=LABEL_VALUE というラベルが付いたノードにカーネル パラメータを設定するには、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
    

    次のように置き換えます。

    • DS_NAMESPACE: DaemonSet をデプロイする Namespace。例: default
    • LABEL_KEY: ラベルの ID。例: workload
    • LABEL_VALUE: ラベルの ID に関連付けられたデータ。例: database
    • INIT_IMAGE: init コンテナに使用されるイメージの名前。
    • MAX_MAP_COUNT: プロセスが作成できるメモリマップ領域の最大数。例: 1073741824
    • CONTAINER_NAME: メインコンテナの名前。例: main
    • CONTAINER_IMAGE: メインコンテナに使用されるイメージの名前。例: latest
  3. DaemonSet をデプロイした後、Kubernetes クラスタ内のすべての Pod が Running 状態にあり、ラベル LABEL_KEY=LABEL_VALUE を持つノードごとに 1 つの Pod があることを確認するには、次のコマンドを使用します。

    kubectl get pods -l LABEL_KEY=LABEL_VALUE
    

    出力例は次のとおりです。

    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. カーネルフラグが正常に適用されたことを確認するには、DaemonSet のデプロイ後に識別された Pod ごとに次のコマンドを実行します。

    kubectl logs POD_NAME
    

    POD_NAME は、ログを調べる Pod の名前に置き換えます。

    出力例は次のとおりです。

    always [within_size] advise never deny force
    

推奨されるカーネル パラメータを使用して Kubernetes ノードにデータベース クラスタをデプロイするには、データベース クラスタ マニフェストの次のいずれかのセクションに nodeAffinity セクションを追加します。

  • プライマリ インスタンスの場合は primarySpec.schedulingConfig
  • 読み取りプール インスタンスの場合は spec.schedulingConfig
      nodeaffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"

特定の Kubernetes ノードでデータベース クラスタを実行する方法については、スケジューリングを使用してデータベース クラスタにノードを割り当てるをご覧ください。

カーネル パラメータの適用を確認する

カーネル パラメータがデータベース Pod に適用されていることを確認する手順は次のとおりです。

  1. 高可用性が有効になっている場合(特に spec.availability.numberOfStandbys がゼロより大きい値に設定されている場合)、データベース カスタム リソースの DBCLUSTERPHASE 列に DBClusterReady が、HAREADYSTATUS 列に True が表示されていることを確認します。

    kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
    

    次のように置き換えます。

    • DBCLUSTER_NAME: 検証するデータベース クラスタの名前。
    • DBCLUSTER_NAMESPACE: データベース クラスタが存在する特定の Namespace の名前。

    出力例は次のとおりです。

    NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
    dbcluster-sample   10.29.21.240      Ready          DBClusterReady   True            Ready
    
  2. データベース クラスタに属する Kubernetes Pod を一覧表示します。

    kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
    
  3. 共有メモリ情報を確認するには、次のコマンドを実行します。

    kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
    
  4. 出力には、すべてのエントリにゼロ以外の数値が含まれている必要があります。

    出力例は次のとおりです。

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

    いずれかのエントリに 0 kB が表示された場合は、対応する Pod を再起動します。

    kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
    
  5. Pod が Running 状態になったら、手順 1~5 を繰り返します。