如何激活 Amazon EKS 节点组上的 HugePages 功能?
我有一个占用大量内存的内存密集型应用程序。我想使用 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 节点:
-
创建包含以下内容的 .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==
-
使用控制台将用户数据转换为 base64。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
export BASE64_RANDOM_OUTPUT=$(cat eks-hugepage-user-data.txt | base64) echo $BASE64_RANDOM_OUTPUT
生成的随机输出将在下一步中保存为变量。
-
使用以下命令创建启动模板。
以下代码中的 $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),因为在下一步中您将需要它。
-
创建包含以下内容的文本文件。在您的设备上将文件保存为 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。
-
使用以下命令在现有 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 官方已更新 1 年前
- AWS 官方已更新 6 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 年前