Amazon ECS Linux 컨테이너 인스턴스 메모리 예약 - Amazon Elastic Container Service

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

Amazon ECS 컨테이너 에이전트가 클러스터에 컨테이너 인스턴스를 등록할 때 에이전트는 컨테이너 인스턴스에서 태스크에 대해 예약할 수 있는 메모리 크기를 결정해야 합니다. 플랫폼 메모리 오버헤드와 운영 체제 커널이 차지하는 메모리로 인해 이 수치가 Amazon EC2 인스턴스에 대해 공급된 설치된 메모리 용량과 다르기 때문입니다 예를 들어, m4.large 인스턴스의 설치된 메모리는 8GiB입니다. 그러나 컨테이너 인스턴스 등록 시 항상 작업에 정확히 8,192MiB의 메모리를 사용할 수 있는 것은 아닙니다.

ECS 관리형 인스턴스 메모리 리소스 결정

Amazon ECS 관리형 인스턴스는 계층적 접근 방식을 사용하여 태스크에 대한 메모리 리소스 요구 사항을 결정합니다. Docker의 메모리 내부 검사에 의존하는 EC2 기반 ECS와 달리 ECS 관리형 인스턴스는 예약 결정 중에 태스크 페이로드에서 직접 메모리 요구 사항을 계산합니다.

ECS 관리형 인스턴스 에이전트가 태스크를 수신하면 다음 우선순위에 따라 메모리 요구 사항을 계산합니다.

  1. 태스크 수준 메모리(가장 높은 우선순위) - 태스크 정의에 태스크 수준 메모리가 지정된 경우 에이전트는 이 값을 직접 사용합니다. 이는 모든 컨테이너 수준 메모리 설정보다 우선합니다.

  2. 컨테이너 수준 메모리 합계(대체) - 태스크 수준 메모리가 지정되지 않은 경우(또는 0인 경우) 에이전트는 태스크의 모든 컨테이너에서 메모리 요구 사항을 합산합니다. 각 컨테이너에 대해 다음을 사용합니다.

    1. 메모리 예약(소프트 제한) - 컨테이너가 구성에서 memoryReservation을 지정하는 경우 에이전트는 이 값을 사용합니다.

    2. 컨테이너 메모리(하드 제한) - memoryReservation이 지정되지 않은 경우 에이전트는 컨테이너의 memory 필드를 사용합니다.

예 지정된 태스크 수준 메모리

태스크 수준 메모리를 지정하면 컨테이너 수준 설정보다 우선합니다.

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

에이전트는 2,048MiB(태스크 수준 메모리가 우선함)를 예약합니다.

예약 기반 컨테이너 수준 메모리

태스크 수준 메모리가 지정되지 않은 경우 에이전트는 컨테이너 메모리 요구 사항을 합산합니다.

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

에이전트는 512MiB(container1 예약) + 512MiB(container2 메모리) = 총 1,024MiB를 예약합니다.

ECS 관리형 인스턴스 에이전트는 3단계로 메모리 계산을 수행합니다.

  1. 태스크 수신 - ECS 컨트롤 플레인에서 태스크 페이로드가 도착하면 에이전트는 즉시 필요한 메모리를 계산합니다.

  2. 리소스 스토리지 - 계산된 메모리 요구 사항은 나중에 리소스 회계 작업에 사용할 수 있도록 태스크 모델에 저장됩니다.

  3. 일정 결정 - 태스크를 수락하기 전에 에이전트는 충분한 메모리를 사용할 수 있는지 확인합니다. 메모리가 부족하면 태스크가 거부되고 리소스를 사용할 수 있을 때까지 ECS 서비스 대기열에 남아 있습니다.

참고

EC2 기반 ECS와 달리 ECS 관리형 인스턴스는 ECS_RESERVED_MEMORY 구성 변수를 사용하지 않습니다. 시스템 프로세스에 대한 메모리 예약은 기본 플랫폼의 리소스 관리를 통해 처리되며 에이전트는 태스크 정의를 기반으로 정확한 리소스 회계를 수행합니다.

EC2 기반 ECS에서 Amazon ECS 컨테이너 에이전트는 ECS_RESERVED_MEMORY라는 구성 변수를 제공합니다. 이를 사용하여 작업에 할당된 풀에서 지정된 메모리 크기(MiB)를 제거할 수 있습니다. 이를 통해 중요 시스템 프로세스에 대한 메모리를 효율적으로 예약합니다.

컨테이너 인스턴스의 모든 메모리를 작업에 사용하는 경우 작업 및 메모리의 중요 시스템 프로세스 경합으로 인해 시스템 오류가 발생할 수 있습니다.

예를 들어, 컨테이너 에이전트 구성 파일에서 ECS_RESERVED_MEMORY=256을 지정한 경우 에이전트는 인스턴스에 대해 총 메모리에서 256MiB를 제외하고 등록하며, 이 256MiB의 메모리는 ECS 작업에 할당될 수 없습니다. 에이전트 구성 변수 및 이를 설정하는 방법에 대한 자세한 정보는 Amazon ECS 컨테이너 에이전트 구성데이터 전달을 위한 Amazon ECS Linux 컨테이너 인스턴스 부트스트래핑 섹션을 참조하세요.

작업에 대해 8,192MiB를 지정하고, 이 요구 사항을 충족하기 위해 8,192MiB 이상의 메모리를 사용할 수 있는 컨테이너 인스턴스가 없는 경우 작업은 클러스터에 배치될 수 없습니다. 관리형 컴퓨팅 환경을 사용 중인 경우 AWS Batch는 요청을 수용하기 위해 더 큰 인스턴스 유형을 시작해야 합니다.

Amazon ECS 컨테이너 에이전트는 Docker ReadMemInfo() 함수를 사용하여 운영 체제가 사용할 수 있는 전체 메모리를 쿼리합니다. Linux 및 Windows 모두 명령줄 유틸리티를 제공하여 총 메모리를 결정합니다.

예 - Linux 총 메모리 결정

free 명령은 운영 체제가 인식한 총 메모리를 반환합니다.

$ free -b

Amazon ECS 최적화된 Amazon Linux AMI를 실행하는 m4.large 인스턴스의 출력 예.

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

이 인스턴스의 총 메모리는 8,373,026,816바이트로, 이는 태스크에 대해 7,985MiB를 사용할 수 있음을 의미합니다.

예 - Windows 총 메모리 결정

wmic 명령은 운영 체제가 인식한 총 메모리를 반환합니다.

C:\> wmic ComputerSystem get TotalPhysicalMemory

Amazon ECS 최적화 Windows Server AMI를 실행하는 m4.large 인스턴스의 출력 예제.

TotalPhysicalMemory 8589524992

이 인스턴스의 총 메모리는 8,589,524,992바이트로, 이는 작업에 대해 8,191MiB를 사용할 수 있음을 의미합니다.

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

컨테이너 인스턴스가 Amazon ECS 콘솔(또는 DescribeContainerInstances API 작업)에 등록하는 메모리 크기를 확인할 수 있습니다. 특정 인스턴스 유형에 대해 가능한 한 많은 메모리를 작업에 제공하여 리소스 사용률을 극대화하려는 경우 해당 컨테이너 인스턴스에 사용 가능한 메모리를 관찰한 다음, 작업에 그만큼의 메모리를 할당할 수 있습니다.

컨테이너 인스턴스 메모리를 보는 방법
  1. https://console.aws.amazon.com/ecs/v2에서 콘솔을 엽니다.

  2. 탐색 창에서 클러스터를 선택하고 컨테이너 인스턴스를 호스팅하는 클러스터를 선택합니다.

  3. 인프라를 선택한 다음, 컨테이너 인스턴스에서 컨테이너 인스턴스를 선택합니다.

  4. 리소스 섹션에서는 컨테이너 인스턴스에 대해 등록된 메모리와 사용 가능한 메모리를 보여줍니다.

    등록됨 메모리 값은 처음 시작할 때 Amazon ECS에 등록된 컨테이너 인스턴스의 값이며, 사용 가능 메모리 값은 작업에 할당되지 않은 값입니다.