Amazon EKS ノードグループで HugePages 機能を有効にする方法を教えてください。

所要時間3分
0

メモリフットプリントが多く、メモリを大量に消費するアプリケーションがあります。Amazon Elastic Kubernetes Service (Amazon EKS) ワーカーノードで HugePages 機能を使用して、アプリケーションのパフォーマンスを向上させたいと思っています。

簡単な説明

Huge Page を使用すると、大量のメモリアクセスを必要とするワークロードのパフォーマンスが向上します。HugePages 機能は、Linux カーネルでデフォルトの 4 KB 割り当てではなく、2 MB と 1 GB のメモリページの割り当てを有効にします。Huge Page は、大きな連続したメモリ領域を使用する、サポートされているインスタンスタイプ (Nitro Enclaves など) で設定可能です。

前提条件

この手順には、eksctl バージョン 0.187.0 以降が必要です。eksctl のウェブサイトから最新バージョンをダウンロードしてインストールします。

解決策

user-data を使用して Amazon EC2 ワーカーノードを設定し、ワークロードの使用量に応じて Huge Page を割り当てます。詳細については、redhat.com のウェブサイトで「Huge Page と Transparent Huge Page」を参照してください。

なお、Huge Page は、起動テンプレートの有無にかかわらず設定できます。

起動テンプレートを使用して HugePages 機能を有効にする

HugePages 機能を有効にしてワーカーノードを起動するための起動テンプレートを作成します。

  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

次に、クラスター内のワークロードに Huge Page がどのように割り当てられているかを確認します。

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 リソースが、そのノードで実行されているポッドによって現在消費されていることを示しています。

関連情報

HugePages の管理 (kubernetes.io のウェブサイト)

AWS公式
AWS公式更新しました 4ヶ月前
コメントはありません