J'ai une application gourmande en mémoire avec une empreinte mémoire importante. Je souhaite utiliser la fonctionnalité HugePages dans les nœuds de travail Amazon Elastic Kubernetes Service (Amazon EKS) pour améliorer les performances de l'application.
Brève description
Les grandes pages améliorent les performances des charges de travail qui requièrent d’importantes quantités d'accès à la mémoire. Au lieu de l'allocation par défaut de 4 Ko, la fonctionnalité HugePages active l'allocation de pages de mémoire de 2 Mo et 1 Go dans le noyau Linux. Les grandes pages sont configurables sur les types d'instances pris en charge (tels que Nitro Enclaves) qui utilisent de grandes zones de mémoire contiguës.
Prérequis
Cette procédure requiert eksctl version 0.187.0 ou ultérieure. Téléchargez et installez la dernière version depuis le site Web d'eksctl.
Résolution
Utilisez user-data pour configurer vos nœuds de travail Amazon EC2 afin d'allouer de grandes pages en fonction de votre consommation de charge de travail. Pour plus d'informations, consultez la page Grandes pages et grandes pages transparentes sur le site Web de redhat.com.
Notez que vous pouvez configurer de grandes pages avec ou sans modèle de lancement.
Activer la fonctionnalité HugePages avec un modèle de lancement
Créez un modèle de lancement pour lancer les nœuds de travail avec la fonctionnalité HugePages activée :
-
Créez un fichier .txt avec le contenu suivant. Enregistrez le fichier sous le nom eks-hugepage-user-data.txt.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash -e
# Check if HugePages is activated
sudo cat /proc/sys/vm/nr_hugepages
# activate HugePages and set the kernel parameter value to 2048
sudo sysctl -w vm.nr_hugepages=2048
# Ensure HugePages is allocated after reboot
sudo echo "vm.nr_hugepages=2048" >> /etc/sysctl.conf
sudo grep Huge /proc/meminfo
echo "hugepages user data script has finished successfully."
--==MYBOUNDARY==
-
Utilisez la console pour convertir les données utilisateur en base64.
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), reportez-vous à la section Résolution d’erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.
export BASE64_RANDOM_OUTPUT=$(cat eks-hugepage-user-data.txt | base64)
echo $BASE64_RANDOM_OUTPUT
La sortie aléatoire générée sera enregistrée en tant que variable à l'étape suivante.
-
Créez le modèle de lancement à l'aide des commandes suivantes.
$BASE64_RANDOM_OUTPUT dans le code suivant sera remplacé par le résultat de l'étape 2.
LAUNCH_TEMPLATE=$(aws ec2 create-launch-template \
--launch-template-name ekshugepages \
--version-description 'Using Huge Pages with Amazon EKS' \
--launch-template-data "{\"UserData\":\"$BASE64_RANDOM_OUTPUT\",\"InstanceType\": \"m5.2xlarge\",\"TagSpecifications\":[{\"ResourceType\":\"instance\",\"Tags\":[{\"Key\":\"purpose\",\"Value\":\"hugepages\"}]}]}" --query 'LaunchTemplate.LaunchTemplateId' --output text)
echo $LAUNCH_TEMPLATE
Notez l'ID du modèle de lancement (par exemple, lt-01234567890abcdef) car vous en aurez besoin à l'étape suivante.
-
Créez un fichier texte avec le contenu suivant. Enregistrez le fichier sous le nom eks-nodegroup.yaml sur votre appareil.
Remplacez LAUNCH_TEMPLATE_ID par la valeur du modèle de lancement que vous avez notée 7 à l'étape 3.
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: my-cluster
region: region-code
version: "1.29"
managedNodeGroups:
# Launch templates - Amazon Linux 2023
- name: hg-al2023
labels: { use-case: large-memory-access }
amiFamily: AmazonLinux2023 # or specify 'AmazonLinux2' for Amazon Linux 2
launchTemplate:
id: LAUNCH_TEMPLATE_ID
version: "1"
Remarque : Les groupes de nœuds gérés créés dans des clusters sur la version 1.30 ou ultérieure utilisent automatiquement par défaut Amazon Linux 2023.
-
Créez le groupe de nœuds dans votre cluster Amazon EKS existant à l'aide de la commande suivante :
eksctl create nodegroup --config-file eks-nodegroup.yaml
Activer la fonctionnalité HugePages sans modèle de lancement
Avant de démarrer une instance vers le cluster, utilisez preBootstrapCommands pour activer la fonctionnalité HugePages. Créez un groupe de nœuds de gestionnaire HugePages avec le fichier de configuration eksctl suivant :
...
managedNodeGroups:
- name: hg
labels: { use-case: large-memory-access }
instanceType: m5.2xlarge
preBootstrapCommands:
# enable huge pages
- "sudo sysctl -w vm.nr_hugepages=2048"
- "sudo echo 'vm.nr_hugepages=2048' >> /etc/sysctl.conf"
Vérifier les nœuds HugePages
Après avoir activé les nœuds HugePages dans votre cluster Amazon EKS, vérifiez les nœuds en procédant comme suit.
Décrivez d'abord les nœuds de votre cluster à l'aide de la commande suivante :
kubectl describe node node_name | egrep 'Capacity|Allocatable' -A5
Votre sortie ressemblera à l'exemple suivant :
Capacity:
cpu: 8
ephemeral-storage: 83873772Ki
hugepages-1Gi: 0
hugepages-2Mi: 4Gi
memory: 32386520Ki
--
Allocatable:
cpu: 7910m
ephemeral-storage: 76224326324
hugepages-1Gi: 0
hugepages-2Mi: 4Gi
memory: 27175384Ki
Ensuite, examinez la façon dont les grandes pages sont allouées aux charges de travail de votre cluster :
kubectl describe nodes node_name | grep 'Allocated' -A9
Votre sortie ressemblera à l'exemple suivant :
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 150m (1%) 0 (0%)
memory 100Mi (0%) 100Mi (0%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 100Mi (2%) 100Mi (2%)
Events:
L'exemple de sortie montre que la ressource hugepages-2Mi est actuellement consommée par un pod s'exécutant sur ce nœud.
Informations connexes
Gérer HugePages sur le site Web de kubernetes.io