Ao configurar parâmetros do kernel, o AlloyDB Omni pode usar a memória do sistema e os recursos de E/S de maneira mais eficiente ao processar cargas de trabalho pesadas.
Pré-requisito
Antes de começar, verifique se os nós do Kubernetes executam o kernel do Linux 6.1 ou mais recente, especificamente um kernel que oferece suporte às flags MADV_COLLAPSE
e MADV_POPULATE_WRITE
. Para mais informações sobre essas flags, consulte a documentação do Linux madwise
.
Aplicar configurações de kernel recomendadas aos nós do Kubernetes
A tabela a seguir lista os parâmetros obrigatórios do kernel e os valores correspondentes para nós do Kubernetes que executam pods de cluster de banco de dados:
Arquivo | Valor |
---|---|
/sys/kernel/mm/transparent_hugepage/shmem_enabled Para informações sobre memória compartilhada, consulte Suporte a páginas enormes transparentes. |
within_size ou always |
/proc/sys/vm/max_map_count Para informações sobre o número de áreas de mapa de memória que um processo pode criar, consulte Documentação para /proc/sys/vm |
Maior que ou igual a 1073741824 |
Para configurar os parâmetros do kernel nos nós do Kubernetes usando um DaemonSet, faça o seguinte:
Aplique rótulos aos nós em que você planeja executar clusters de banco de dados usando as instruções em Adicionar um rótulo a um nó.
Para definir os parâmetros do kernel nos nós rotulados como
LABEL_KEY=LABEL_VALUE
, crie um 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
Substitua:
DS_NAMESPACE
: o namespace em que você quer implantar o DaemonSet, por exemplo,default
.LABEL_KEY
: o identificador do rótulo. Por exemplo,workload
.LABEL_VALUE
: os dados associados ao identificador do rótulo. Por exemplo,database
.INIT_IMAGE
: o nome da imagem usada para o contêiner de inicialização.MAX_MAP_COUNT
: o número máximo de áreas de mapeamento de memória que um processo pode criar. Por exemplo,1073741824
.CONTAINER_NAME
: o nome do contêiner principal. Por exemplo,main
.CONTAINER_IMAGE
: o nome da imagem usada para o contêiner principal. Por exemplo,latest
.
Depois de implantar o DaemonSet, para verificar se todos os pods no cluster do Kubernetes estão no estado
Running
e se você tem um pod para cada nó com o rótuloLABEL_KEY=LABEL_VALUE
, use o seguinte comando:kubectl get pods -l LABEL_KEY=LABEL_VALUE
Veja abaixo um exemplo de saída:
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 se a flag do kernel foi aplicada, execute o seguinte comando para cada um dos pods identificados após a implantação do DaemonSet:
kubectl logs POD_NAME
Substitua
POD_NAME
pelo nome do pod que você quer examinar os registros.Veja abaixo um exemplo de saída:
always [within_size] advise never deny force
Executar clusters de banco de dados em nós do Kubernetes com parâmetros de kernel recomendados
Para implantar clusters de banco de dados em nós do Kubernetes com parâmetros de kernel recomendados, adicione uma seção nodeAffinity
a uma das seguintes seções do manifesto do cluster de banco de dados:
primarySpec.schedulingConfig
para instâncias principaisspec.schedulingConfig
para instâncias do pool de leitura
nodeaffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: LABEL_KEY
operator: In
values:
- "LABEL_VALUE"
Para mais informações sobre como executar clusters de banco de dados em nós específicos do Kubernetes, consulte Atribuir nós a um cluster de banco de dados usando o agendamento.
Verificar a aplicação de parâmetros do kernel
Para verificar se os parâmetros do kernel foram aplicados aos pods de banco de dados, faça o seguinte:
Se a alta disponibilidade estiver ativada, especificamente
spec.availability.numberOfStandbys
estiver definido como um valor maior que zero, verifique se o recurso personalizado do banco de dados mostraDBClusterReady
na coluna DBCLUSTERPHASE eTrue
na coluna HAREADYSTATUS.kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
Substitua:
DBCLUSTER_NAME
: o nome do cluster de banco de dados que você verifica.DBCLUSTER_NAMESPACE
: o nome do namespace específico em que o cluster de banco de dados está localizado.
Veja abaixo um exemplo de saída:
NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON dbcluster-sample 10.29.21.240 Ready DBClusterReady True Ready
Liste os pods do Kubernetes que pertencem ao cluster de banco de dados:
kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
Para verificar informações sobre a memória compartilhada, execute o seguinte comando:
kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
A saída precisa conter números diferentes de zero em todas as entradas.
Veja abaixo um exemplo de saída:
Shmem: 126255872 kB ShmemHugePages: 18403328 kB ShmemPmdMapped: 2961408 kB
Se você vir
0 kB
em alguma das entradas, reinicie o pod correspondente:kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
Repita as etapas de 1 a 5 depois que o pod estiver no estado
Running
.