Comment puis-je activer la fonctionnalité HugePages sur les groupes de nœuds Amazon EKS ?

Lecture de 5 minute(s)
0

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 :

  1. 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==
  2. 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.

  3. 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.

  4. 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.

  5. 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

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 4 mois