Configurar los parámetros del kernel permite que AlloyDB Omni use la memoria del sistema y los recursos de E/S de manera más eficiente cuando controla cargas de trabajo pesadas.
Requisitos
Antes de comenzar, asegúrate de que tus nodos de Kubernetes ejecuten el kernel de Linux 6.1 o una versión posterior, específicamente un kernel que admita las marcas MADV_COLLAPSE y MADV_POPULATE_WRITE. Para obtener más información sobre estas marcas, consulta la documentación de madwise de Linux.
Aplica la configuración recomendada del kernel a los nodos de Kubernetes
En la siguiente tabla, se enumeran los parámetros del kernel obligatorios y sus valores correspondientes para los nodos de Kubernetes que ejecutan pods de clúster de bases de datos:
| Archivo | Valor |
|---|---|
/sys/kernel/mm/transparent_hugepage/shmem_enabledPara obtener información sobre la memoria compartida, consulta Transparent Hugepage Support. |
within_size o always |
/proc/sys/vm/max_map_countPara obtener información sobre la cantidad de áreas de asignación de memoria que puede crear un proceso, consulta Documentación de /proc/sys/vm |
Mayor o igual que 1073741824 |
Para configurar los parámetros del kernel en tus nodos de Kubernetes con un DaemonSet, haz lo siguiente:
Aplica etiquetas a los nodos en los que planeas ejecutar clústeres de bases de datos siguiendo las instrucciones que se indican en Cómo agregar una etiqueta a un nodo.
Para establecer los parámetros del kernel en los nodos etiquetados como
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"] EOFReemplaza lo siguiente:
DS_NAMESPACE: Es el espacio de nombres en el que deseas implementar el DaemonSet, por ejemplo,default.LABEL_KEY: Es el identificador de la etiqueta, por ejemplo,workload.LABEL_VALUE: Son los datos asociados al identificador de la etiqueta, por ejemplo,database.INIT_IMAGE: Es el nombre de la imagen que se usa para el contenedor de inicialización.MAX_MAP_COUNT: Es la cantidad máxima de áreas de asignación de memoria que puede crear un proceso, por ejemplo,1073741824.CONTAINER_NAME: Es el nombre del contenedor principal, por ejemplo,main.CONTAINER_IMAGE: Es el nombre de la imagen que se usa para el contenedor principal, por ejemplo,latest.
Después de implementar el DaemonSet, para verificar que todos los Pods de tu clúster de Kubernetes estén en el estado
Runningy que tengas un Pod para cada nodo con la etiquetaLABEL_KEY=LABEL_VALUE, usa el siguiente comando:kubectl get pods -l LABEL_KEY=LABEL_VALUEUn ejemplo de resultado se ve de la siguiente manera:
NAME READY STATUS RESTARTS AGE alloydb-omni-kernel-tuning-2dkwh 1/1 Running 0 22s alloydb-omni-kernel-tuning-pgkbj 1/1 Running 0 19sPara verificar que la marca del kernel se haya aplicado correctamente, ejecuta el siguiente comando para cada uno de los Pods identificados después de implementar el DaemonSet:
kubectl logs POD_NAMEReemplaza
POD_NAMEpor el nombre del Pod cuyos registros deseas examinar.Un ejemplo de resultado se ve de la siguiente manera:
always [within_size] advise never deny force
Ejecuta clústeres de bases de datos en nodos de Kubernetes con parámetros del kernel recomendados
Para implementar clústeres de bases de datos en nodos de Kubernetes con parámetros del kernel recomendados, agrega una sección nodeAffinity a una de las siguientes secciones del manifiesto del clúster de bases de datos:
primarySpec.schedulingConfigpara instancias principalesspec.schedulingConfigpara instancias de grupo de lectura
nodeaffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: LABEL_KEY
operator: In
values:
- "LABEL_VALUE"
Para obtener más información sobre cómo ejecutar clústeres de bases de datos en nodos específicos de Kubernetes, consulta Asigna nodos a un clúster de bases de datos con la programación.
Verifica la aplicación de los parámetros del kernel
Para verificar que los parámetros del kernel se apliquen a los Pods de la base de datos, haz lo siguiente:
Si la alta disponibilidad está habilitada, específicamente
spec.availability.numberOfStandbysse establece en un valor mayor que cero, verifica que el recurso personalizado de la base de datos muestreDBClusterReadyen la columna DBCLUSTERPHASE yTrueen la columna HAREADYSTATUS.kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAMEReemplaza lo siguiente:
DBCLUSTER_NAME: Es el nombre del clúster de la base de datos que verificas.DBCLUSTER_NAMESPACE: Es el nombre del espacio de nombres específico en el que reside tu clúster de base de datos.
Un ejemplo de resultado se ve de la siguiente manera:
NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON dbcluster-sample 10.29.21.240 Ready DBClusterReady True ReadyEnumera los Pods de Kubernetes que pertenecen al clúster de la base de datos:
kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAMEPara verificar la información de la memoria compartida, ejecuta el siguiente comando:
kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfoEl resultado debe contener números distintos de cero en todas las entradas.
Un ejemplo de resultado se ve de la siguiente manera:
Shmem: 126255872 kB ShmemHugePages: 18403328 kB ShmemPmdMapped: 2961408 kBSi ves
0 kBen alguna de las entradas, reinicia el Pod correspondiente:kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAMERepite los pasos del 1 al 5 después de que el pod esté en el estado
Running.