Configurar los parámetros del kernel permite que AlloyDB Omni use la memoria del sistema y los recursos de E/S de forma más eficiente al gestionar cargas de trabajo pesadas.
Requisitos previos
Antes de empezar, asegúrate de que tus nodos de Kubernetes ejecuten el kernel de Linux 6.1 o una versión posterior, concretamente 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 Linux madwise
.
Aplicar la configuración del kernel recomendada a los nodos de Kubernetes
En la siguiente tabla se indican 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_enabled Para obtener información sobre la memoria compartida, consulta Compatibilidad con páginas enormes transparentes. |
within_size o always |
/proc/sys/vm/max_map_count Para obtener información sobre el número de áreas de mapa de memoria que puede crear un proceso, consulta la documentación de /proc/sys/vm . |
Mayor o igual que 1073741824 |
Para configurar los parámetros del kernel en los nodos de Kubernetes mediante un DaemonSet, haz lo siguiente:
Aplica etiquetas a los nodos en los que tengas previsto ejecutar clústeres de bases de datos siguiendo las instrucciones de Añadir una etiqueta a un nodo.
Para definir 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"] EOF
Haz los cambios siguientes:
DS_NAMESPACE
: el espacio de nombres en el que quieres implementar el DaemonSet. Por ejemplo,default
.LABEL_KEY
: el identificador de la etiqueta (por ejemplo,workload
).LABEL_VALUE
: los datos asociados al identificador de la etiqueta, por ejemplo,database
.INIT_IMAGE
: el nombre de la imagen usada para el contenedor init.MAX_MAP_COUNT
: el número máximo de áreas de asignación de memoria que puede crear un proceso. Por ejemplo,1073741824
.CONTAINER_NAME
: el nombre del contenedor principal (por ejemplo,main
).CONTAINER_IMAGE
: el nombre de la imagen usada 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
Running
y que tienes un pod por cada nodo con la etiquetaLABEL_KEY=LABEL_VALUE
, usa el siguiente comando:kubectl get pods -l LABEL_KEY=LABEL_VALUE
Un ejemplo de salida sería el siguiente:
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
Para verificar que la marca del kernel se ha aplicado correctamente, ejecuta el siguiente comando en cada uno de los pods identificados después de implementar el DaemonSet:
kubectl logs POD_NAME
Sustituye
POD_NAME
por el nombre del pod cuyos registros quieras examinar.Un ejemplo de salida sería el siguiente:
always [within_size] advise never deny force
Ejecutar clústeres de bases de datos en nodos de Kubernetes con parámetros de kernel recomendados
Para desplegar clústeres de bases de datos en nodos de Kubernetes con los parámetros de kernel recomendados, añade una sección nodeAffinity
a una de las siguientes secciones del manifiesto de tu clúster de bases de datos:
primarySpec.schedulingConfig
para instancias principalesspec.schedulingConfig
para instancias de grupos 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 de Kubernetes específicos, consulta Asignar nodos a un clúster de bases de datos mediante la programación.
Verificar la aplicación de los parámetros del kernel
Para verificar que los parámetros del kernel se aplican a los pods de la base de datos, haz lo siguiente:
Si la alta disponibilidad está habilitada, es decir, si
spec.availability.numberOfStandbys
tiene un valor superior a cero, comprueba que el recurso personalizado de la base de datos muestreDBClusterReady
en la columna DBCLUSTERPHASE yTrue
en la columna HAREADYSTATUS.kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
Haz los cambios siguientes:
DBCLUSTER_NAME
: el nombre del clúster de bases de datos que verificas.DBCLUSTER_NAMESPACE
: el nombre del espacio de nombres específico en el que se encuentra tu clúster de base de datos.
Un ejemplo de salida sería el siguiente:
NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON dbcluster-sample 10.29.21.240 Ready DBClusterReady True Ready
Lista 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_NAME
Para consultar la información de la memoria compartida, ejecuta el siguiente comando:
kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
El resultado debe contener números distintos de cero en todas las entradas.
Un ejemplo de salida sería el siguiente:
Shmem: 126255872 kB ShmemHugePages: 18403328 kB ShmemPmdMapped: 2961408 kB
Si ves
0 kB
en alguna de las entradas, reinicia el pod correspondiente:kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
Repite los pasos del 1 al 5 cuando el pod esté en el estado
Running
.