ECS EC2 배포 태스크 정의 하드제한 소프트제한

프로필 사진mingke

AWS Logo ecs ec2 memory limit

목차

인트로

AWS ECS EC2를 배포하는 과정에서 태스크 정의를 작성해야합니다. 태스크 정의를 작성할 때 컨테이너 설정을 부분에서 리소스를 할당한은 옵션이 있습니다. 오늘은 그 중에서 메모리를 제한할 때 사용하는 개념인 하드제한소프트 제한을 알아보도록 하겠습니다.

컨테이너를 EC2 인스턴스 위에서 실행하는 것이다보니, 여러 컨테이너를 실행하기 위해 태스크마다 적절하게 자원을 배분해주어야 합니다. 현재 운영하고 있는 서비스들에 대해서는 CPU는 탄력적으로 사용하기 위해 제한을 두고 있지 않고 있습니다. 메모리는 하드제한, 소프트제한으로 구성해서 운영하고 있습니다. 메모리는 하드 또는 소프트로 반드시 제한을 두도록 하고 있습니다.

태스크 정의를 생성하고 확인해보면 하드제한은 memory, 소프트제한은 memoryReservation으로 할당 됩니다.

하드 제한

하드제한은 컨테이너가 사용할 수 있는 메모리의 최대 크기입니다. 컨테이너가 사용할 수 있는 최대 메모리양을 명시적으로 지정하는 것입니다. 하드 제한으로 설정된 메모리까지 다 차면 컨테이너가 죽을 수 있습니다.

소프트 제한

소프트 제한은 컨테이너가 정상적으로 실행될 때 필요한 최소 메모리 양을 지정하는 것입니다. 시스템의 리소스가 허용된다면 추가로 더 사용할 수 있도록 어느 정도의 유연성을 가집니다.

하드 제한과 소프트 제한 조합

물론 상황에 따라 다를 수 있겠지만, 하드 제한과 소프트 제한을 적절하게 조합을 하는 것이 중요합니다. 두가지를 조합한다면 하드 제한을 소프트 제한보다 높게 적용합니다.

  • 소프트제한: 실행에 필요한 최소
  • 하드제한: 사용할 수 있는 최대

하드제한만 사용하는 경우

하드제한만 사용할 경우 불필요하게 메모리가 하나의 컨테이너에 많이 할당될 수 있습니다. 만약 내가 실행하고자 하는 애플리케이션이 0.256기가바이트만 필요로하는데 0.512기가바이트로 하드제한만 설정해 둔다면 나머지 0.256은 사용되지도 못하고 리소스가 낭비됩니다. 인스턴스 사용하는게 다 돈인데, 리소스가 사용되지도 못하고 하나의 태스크에 독점되면 안되겠죠.

소프트 제한만 사용하는 경우

소프트 제한만 사용하게 된다면 최대 제한이 없기 때문에, 소프트 제한된 양보다 더 많은 양의 메모리를 사용할 수 있습니다. 하지만 태스크를 여러개 실행하여 다수의 컨테이너가 돌고 있다면 메모리 경합이 일어나 성능 저하를 유발할 수 있다고 합니다.

너무 당연하지만 소프트 제한만 사용하더라도 사용하고 있는 EC2 인스턴스의 최대 메모리는 넘길 수 없습니다.

예시로 동작 알아보기

다음과 같은 상황이 있다고 가정 해봅니다.

4개의 태스크가 실행중이고 가용 메모리는 458 입니다. 여기서 만약 태스크를 하나 더 실행하고 싶다고 가정해봅니다.

ecs 컨테이너 정보

새로운 태스크 정의를 작성했고 새롭게 작성한 태스크 정의로 컨테이너를 실행해봤습니다. 그런데 다음과 같은 에러가 발생했습니다.

ecs 서비스 배포 실패

문제의 원인은 메모리를 하드 제한만 512로 설정한 것이었습니다. 가용메모리가 458이기 때문에 하드 제한만 512를 하면 458이 512보다 작기 때문에 에러가 발생합니다.

ecs 태스크 메모리 하드 제한

태스크 개정을 만들어 다음과 같이 수정해 주었습니다. 하드 제한은 그대로 두고 소프트 제한을 256추가 해주었습니다. 그렇게되면 위에서 언급한 것처럼 실행에 256만 필요하게 되어 새로운 컨테이너를 실행할 수 있습니다.

ecs 태스크 메모리 하드 제한 소프트 제한

실행되고 컨테이너 인스턴스를 확인해보면 가용 메모리가 196입니다. 소프트제한을 256으로 제한했는데 태스크 정의를 생성하고 확인해보면 256이 아니라 262로 할당이 됩니다. 따라서 458-262=196 이 됩니다. 이 차이에 대해서 정확히 어떤 방식으로 할당이 되는 것인지 잘 모르겠네요.

ecs 컨테이너 정보 서비스 배포 후

마무리

ECS에서 컨테이너의 메모리 하드 제한과 소프트 제한의 사용을 알아봤습니다. 하드제한과 소프트제한을 얼마로 지정해야하나 하는 고민이 있었는데요. 보통 웹 애플리케이션을 배포하는 경우, 하드 제한은 300~500사이를 지정하면 되는 것 같고, 소프트 제한은 그보다 아래로 소프트하게 지정하면 되는 것 같습니다. 그렇게 운영해보다가 증가가 필요해지면 태스크 정의를 개정하여 다시 재배포하면 쉽게 변경할 수 있습니다.