使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何激活 Amazon EKS 节点组上的 HugePages 功能?

3 分钟阅读
0

我有一个占用大量内存的内存密集型应用程序。我想使用 Amazon Elastic Kubernetes Service (Amazon EKS) Worker 节点中的 HugePages 功能来提高应用程序的性能。

简短描述

大页可以提高需要大量内存访问的工作负载的性能。HugePages 功能未使用默认的 4 KB 分配,而是在 Linux 内核中启用 2 MB 和 1 GB 内存页的分配。可以在使用大型连续内存区域的支持的实例类型(例如 Nitro Enclaves)上配置大页。

先决条件

此过程需要 eksctl 版本 0.187.0 或更高版本。从 eksctl 网站下载并安装最新版本。

解决方法

使用 user-data 配置您的 Amazon EC2 Worker 节点,以便为您的工作负载分配大页。有关详细信息,请参阅 redhat.com 网站上的大页和透明大页

请注意,您可以使用或不使用启动模板来配置大页。

使用启动模板启用 HugePages 功能

创建启动模板以在启用 HugePages 功能的情况下启动 Worker 节点:

  1. 创建包含以下内容的 .txt 文件。保存名为 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. 使用控制台将用户数据转换为 base64。

    **注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

    export BASE64_RANDOM_OUTPUT=$(cat eks-hugepage-user-data.txt | base64)
    echo $BASE64_RANDOM_OUTPUT

    生成的随机输出将在下一步中保存为变量。

  3. 使用以下命令创建启动模板。

    以下代码中的 $BASE64_RANDOM_OUTPUT 将替换为步骤 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    

    记下启动模板 ID(例如,lt-01234567890abcdef),因为在下一步中您将需要它。

  4. 创建包含以下内容的文本文件。在您的设备上将文件保存为 eks-nodegroup.yaml

    LAUNCH_TEMPLATE_ID 替换为您在步骤 3 中记下的启动模板值 7。

    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"

    **注意:**在 1.30 或更高版本的集群中创建的托管式节点组将自动默认使用 Amazon Linux 2023。

  5. 使用以下命令在现有 Amazon EKS 集群中创建节点组:

    eksctl create nodegroup --config-file eks-nodegroup.yaml

在没有启动模板的情况下启用 HugePages 功能

在将实例引导到集群之前,使用 preBootstrapCommands 启用 HugePages 功能。使用以下 eksctl 配置文件创建 HugePages 管理器节点组:

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

验证 HugePages 节点

在 Amazon EKS 集群中打开 HugePages 节点后,请按照以下步骤验证节点。

首先,使用以下命令描述集群中的节点:

kubectl describe node node_name | egrep 'Capacity|Allocatable' -A5

您的输出将与以下示例类似:

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

接下来,查看如何向集群中的工作负载分配大页:

kubectl describe nodes node_name | grep 'Allocated' -A9

您的输出将与以下示例类似:

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:

示例输出显示,hugepages-2Mi 资源目前由在该节点上运行的容器组使用。

相关信息

kubernetes.io 网站上的管理 HugePages

AWS 官方
AWS 官方已更新 2 个月前