Amazon EKS 노드 그룹에서 HugePages 기능을 활성화하려면 어떻게 해야 합니까?

4분 분량
0

메모리 사용량이 많은 메모리 집약적 애플리케이션이 있습니다. Amazon Elastic Kubernetes Service(Amazon EKS) 워커 노드의 HugePages 기능을 사용하여 앱 성능을 개선하고 싶습니다.

간략한 설명

HugePages는 대량의 메모리 액세스가 필요한 워크로드의 성능을 개선합니다. HugePages 기능은 Linux 커널에서 기본 4KB 할당 대신 2MB 및 1GB 메모리 페이지 할당을 활성화합니다. 대규모 연속 메모리 영역을 사용하는 지원되는 인스턴스 유형(예: Nitro Enclaves)에서 HugePages를 구성할 수 있습니다.

사전 요구 사항

이 절차를 수행하려면 eksctl 버전 0.187.0 이상이 필요합니다. eksctl 웹사이트에서 최신 버전을 다운로드하여 설치하십시오.

해결 방법

user-data를 사용해 Amazon EC2 워커 노드를 구성하여 워크로드 소비에 필요한 HugePages를 할당합니다. 자세한 내용은 redhat.com 웹사이트의 HugePages 및 투명한 HugePages를 참조하십시오.

시작 템플릿을 사용하거나 사용하지 않고 HugePages를 구성할 수 있다는 점에 유의하십시오.

시작 템플릿으로 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 Command Line Interface(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

다음으로, 클러스터의 워크로드에 HugePages가 어떻게 할당되었는지 검토합니다.

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 공식업데이트됨 4달 전