Amazon ECS Linux 컨테이너 인스턴스 메모리 예약하기

Amazon ECS Linux 컨테이너 인스턴스 메모리 예약하기

Amazon ECS container agent가 컨테이너 인스턴스의 메모리를 어떻게 결정하고 예약하는지, 그리고 ECS Managed Instances와 ECS on EC2의 메모리 계산 방식을 알아봐요.

출처: 문서

본문

Amazon ECS container agent가 컨테이너 인스턴스를 클러스터에 등록할 때, 에이전트는 태스크를 위해 예약할 수 있는 메모리 양을 결정해야 해요. 플랫폼 메모리 오버헤드와 시스템 커널이 점유하는 메모리 때문에 이 숫자는 Amazon EC2 인스턴스에 광고되는 설치 메모리 양과 달라요. 예를 들어 m4.large 인스턴스에는 8 GiB의 설치 메모리가 있어요. 그러나 컨테이너 인스턴스가 등록될 때 이것이 항상 태스크에 사용 가능한 정확히 8192 MiB의 메모리로 해석되지는 않아요.

ECS Managed Instances 메모리 리소스 결정

Amazon ECS Managed Instances는 태스크의 메모리 리소스 요구 사항을 결정하기 위해 계층적 접근 방식을 사용해요. Docker의 메모리 인트로스펙션에 의존하는 ECS on EC2와 달리, ECS Managed Instances는 스케줄링 결정 중에 태스크 페이로드에서 직접 메모리 요구 사항을 계산해요.

ECS Managed Instances agent가 태스크를 받으면 다음 우선순위 순서로 메모리 요구 사항을 계산해요:

  • 태스크 수준 메모리 (최우선 순위) - 태스크 정의에 태스크 수준 메모리가 지정되면 에이전트는 이 값을 직접 사용해요. 이는 모든 컨테이너 수준 메모리 설정보다 우선해요.
  • 컨테이너 수준 메모리 합계 (폴백) - 태스크 수준 메모리가 지정되지 않으면(또는 0이면) 에이전트는 태스크의 모든 컨테이너의 메모리 요구 사항을 합산해요. 각 컨테이너에 대해 다음을 사용해요:
    • 메모리 예약(소프트 한도) - 컨테이너가 구성에서 memoryReservation을 지정하면 에이전트는 이 값을 사용해요.
    • 컨테이너 메모리 (하드 한도) - memoryReservation이 지정되지 않으면 에이전트는 컨테이너의 memory 필드를 사용해요.

예시: 태스크 수준 메모리 지정

태스크 수준 메모리가 지정되면 컨테이너 수준 설정보다 우선해요:

{
  "family": "my-task",
  "memory": "2048",
  "containerDefinitions": [
    {
      "name": "container1",
      "memory": 1024,
      "memoryReservation": 512
    }
  ]
}

에이전트는 2048 MiB를 예약해요(태스크 수준 메모리가 우선).

예시: 예약이 있는 컨테이너 수준 메모리

태스크 수준 메모리가 지정되지 않으면 에이전트는 컨테이너 메모리 요구 사항을 합산해요:

{
  "family": "my-task",
  "containerDefinitions": [
    {
      "name": "container1",
      "memory": 1024,
      "memoryReservation": 512
    },
    {
      "name": "container2",
      "memory": 512
    }
  ]
}

에이전트는 512 MiB(container1 예약) + 512 MiB(container2 memory) = 총 1024 MiB를 예약해요.

ECS Managed Instances agent는 세 단계로 메모리 계산을 수행해요:

  1. 태스크 수신 - ECS 컨트롤 플레인에서 태스크 페이로드가 도착하면 에이전트는 필요한 메모리를 즉시 계산해요.
  2. 리소스 저장 - 계산된 메모리 요구 사항은 나중에 리소스 회계 작업에 사용하기 위해 태스크 모델에 저장돼요.
  3. 스케줄링 결정 - 태스크를 수락하기 전에 에이전트는 충분한 메모리가 사용 가능한지 확인해요. 메모리가 부족하면 태스크는 거부되고 리소스가 사용 가능해질 때까지 ECS 서비스 큐에 남아요.

참고 — ECS on EC2와 달리, ECS Managed Instances는 ECS_RESERVED_MEMORY 구성 변수를 사용하지 않아요. 시스템 프로세스의 메모리 예약은 기본 플랫폼의 리소스 관리를 통해 처리되며, 에이전트는 태스크 정의를 기반으로 정확한 리소스 회계를 수행해요.

ECS on EC2에서의 메모리 예약

ECS on EC2의 경우 Amazon ECS container agent는 ECS_RESERVED_MEMORY라는 구성 변수를 제공해요. 이를 사용해 태스크에 할당되는 풀에서 지정된 수의 MiB 메모리를 제거할 수 있어요. 이는 효과적으로 그 메모리를 중요한 시스템 프로세스를 위해 예약해요.

컨테이너 인스턴스의 모든 메모리를 태스크가 점유하면 태스크가 중요한 시스템 프로세스와 메모리를 두고 경쟁하고 시스템 장애를 시작할 가능성이 있어요. 예를 들어 container agent 구성 파일에 ECS_RESERVED_MEMORY=256을 지정하면 에이전트는 그 인스턴스에 대해 총 메모리에서 256 MiB를 뺀 값을 등록하고, 256 MiB의 메모리는 ECS 태스크가 할당할 수 없게 돼요. agent 구성 변수와 설정 방법에 대한 자세한 내용은 Amazon ECS container agent configuration 및 Bootstrapping Amazon ECS Linux container instances to pass data 참고.

태스크에 8192 MiB를 지정했는데 어떤 컨테이너 인스턴스도 이 요구 사항을 충족할 수 있는 8192 MiB 이상의 메모리를 사용할 수 없다면, 태스크는 클러스터에 배치될 수 없어요. 관리형 컴퓨팅 환경을 사용한다면 AWS Batch가 요청을 수용하기 위해 더 큰 인스턴스 유형을 시작해야 해요.

Amazon ECS container agent는 Docker ReadMemInfo() 함수를 사용해 운영 체제에 사용 가능한 총 메모리를 쿼리해요. Linux와 Windows 모두 총 메모리를 결정하는 명령줄 유틸리티를 제공해요.

예시 - Linux 총 메모리 결정

free 명령은 운영 체제가 인식하는 총 메모리를 반환해요.

$ free -b

Amazon ECS-optimized Amazon Linux AMI를 실행하는 m4.large 인스턴스의 예시 출력:

             total       used       free     shared    buffers     cached
Mem:    8373026816  348180480 8024846336      90112   25534464  205418496
-/+ buffers/cache:  117227520 8255799296

이 인스턴스는 8373026816 바이트의 총 메모리를 가지며, 이는 태스크에 사용 가능한 7985 MiB로 변환돼요.

예시 - Windows 총 메모리 결정

wmic 명령은 운영 체제가 인식하는 총 메모리를 반환해요.

C:\> wmic ComputerSystem get TotalPhysicalMemory

Amazon ECS-optimized Windows Server AMI를 실행하는 m4.large 인스턴스의 예시 출력:

TotalPhysicalMemory
8589524992

이 인스턴스는 8589524992 바이트의 총 메모리를 가지며, 이는 태스크에 사용 가능한 8191 MiB로 변환돼요.

컨테이너 인스턴스 메모리 보기

Amazon ECS 콘솔(또는 DescribeContainerInstances API 작업)에서 컨테이너 인스턴스가 등록하는 메모리 양을 볼 수 있어요. 특정 인스턴스 유형에 대해 태스크에 가능한 한 많은 메모리를 제공해 리소스 활용을 최대화하려면, 해당 컨테이너 인스턴스에 사용 가능한 메모리를 관찰한 후 태스크에 그만큼의 메모리를 할당할 수 있어요.

컨테이너 인스턴스 메모리를 보려면:

  1. 콘솔(https://console.aws.amazon.com/ecs/v2)을 엽니다.
  2. 내비게이션 창에서 Clusters를 선택한 후 컨테이너 인스턴스를 호스팅하는 클러스터를 선택합니다.
  3. Infrastructure를 선택한 후 Container instances 아래에서 컨테이너 인스턴스를 선택합니다.
  4. Resources 섹션에 컨테이너 인스턴스에 등록되고 사용 가능한 메모리가 표시됩니다.

Registered memory 값은 컨테이너 인스턴스가 처음 시작될 때 Amazon ECS에 등록한 값이고, Available memory 값은 아직 태스크에 할당되지 않은 값이에요.

더 알아보기 (Learn more)