Amazon EKS ノードグループで HugePages 機能を有効にする方法を教えてください。
メモリフットプリントが多く、メモリを大量に消費するアプリケーションがあります。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 機能を有効にしてワーカーノードを起動するための起動テンプレートを作成します。
-
次の内容の .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
次に、クラスター内のワークロードに 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 のウェブサイト)
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 1ヶ月前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 5年前