Skip to content

Amazon ECS에서 OutOfMemory 오류를 해결하려면 어떻게 해야 합니까?

5분 분량
0

Amazon Elastic Container Service(Amazon ECS) 작업에 메모리 사용 문제가 있습니다. 또는 OuTofMemory 오류로 인해 컨테이너가 종료됩니다.

간략한 설명

메모리 부족 문제가 발생하면 Amazon ECS에서 작업을 중지하고 다음과 같은 오류 메시지가 표시됩니다.

"OutOfMemoryError: Container killed due to memory usage".

이 문제는 컨테이너의 프로세스가 작업 정의에서 할당한 양보다 많은 메모리를 사용할 때 발생합니다. OutofMemory 문제를 해결하려면 다음 문제 해결 작업을 수행하십시오.

해결 방법

메모리 소진으로 인해 Amazon ECS에서 종료한 작업 식별

메모리 소진으로 인해 Amazon ECS에서 종료한 작업을 식별하려면 다음 단계를 완료하십시오.

  1. Amazon ECS 콘솔에서 중지된 작업을 확인합니다.
  2. 일반적으로 Amazon ECS에서 메모리 관련 오류가 발생할 때 나타나는 137 또는 139 종료 코드가 있는 작업을 찾습니다.
  3. 메모리 문제가 발견되면 작업이 중지된 원인이 된 힙 메모리 부족 문제를 확인하기 위해 컨테이너 에이전트 로그를 점검하십시오.

컨테이너 메모리 사용량 모니터링 및 분석

메모리 관련 애플리케이션 문제를 해결하려면 Amazon CloudWatch Logs를 사용하여 작업을 분석하십시오. Amazon ECS 또는 CloudWatch 콘솔을 사용하여 서비스 메모리 사용량을 모니터링할 수 있습니다. 컨테이너별 메모리 지표의 경우 향상된 관찰성을 갖춘 CloudWatch Container Insights를 설정하십시오.

시간 경과에 따른 컨테이너의 메모리 사용량을 분석하려면 CloudWatch Logs Insights의 사용자 지정 쿼리를 사용하십시오.

쿼리 예제:

stats max(MemoryUtilized) as mem, max(MemoryReserved ) as memreserved by bin (5m) as period, TaskId, ContainerName
| sort period desc
| filter ContainerName like "example-container-name"
| filter TaskId = "example-task-id"

참고: example-container-name을 컨테이너 이름으로, example-task-id를 작업 ID로 바꾸십시오.

Amazon ECS 작업 및 컨테이너에서 메모리 할당량 설정

작업 수준에서 전체 작업에 대한 하드 메모리 할당량을 설정할 수 있습니다. 컨테이너 수준에서 memoryReservation(메모리 소프트 제한) 및 memory(메모리 하드 제한) 파라미터를 사용하여 메모리를 할당할 수 있습니다.

애플리케이션을 배포하기 전에 호스트에 사용 가능한 메모리가 충분한지 확인하십시오. 그런 다음 소프트 및 하드 메모리 할당량으로 작업 정의를 업데이트하십시오.

참고: memoryReservation 파라미터는 Linux 컨테이너에서만 사용할 수 있습니다.

작업 정의 예시:

"containerDefinitions": [
    {
        "name": "example-container-name",
        "memory": 1024,
        "memoryReservation": 512
        // ... other container properties
    }
]

일시적 메모리 요구량이 높은 컨테이너에 대한 스왑 구성

참고: maxSwapsharedMemorySize 파라미터를 사용하려면 작업에서 Amazon Elastic Compute Cloud(Amazon EC2) 시작 유형을 사용해야 합니다.

컨테이너에서 일시적인 메모리 사용량이 급증하는 경우 스왑 구성을 사용하도록 작업 정의를 업데이트하십시오. 스왑은 부하가 높은 기간 동안 발생하는 OutOfMemory 오류를 줄여줍니다. 그러나 스왑은 애플리케이션 속도를 늦출 수도 있습니다. 스왑을 활성화한 후 애플리케이션의 성능을 모니터링하십시오.

런타임 프레임워크를 기반으로 애플리케이션의 메모리 설정 조정

사용 가능한 시스템 메모리가 있거나 컨테이너 할당량이 증가했더라도 프레임워크 또는 런타임 기본 메모리 할당량에 도달하면 애플리케이션이 중지될 수 있습니다. 이 문제를 해결하려면 애플리케이션의 메모리 사용 패턴을 모니터링하십시오. 프레임워크 또는 런타임의 기본 메모리 설정을 파악한 다음 애플리케이션 요구 사항에 맞게 작업 메모리 파라미터를 조정합니다.

**Java 애플리케이션 **

JVM(Java Virtual Machine, Java 가상 머신)은 스타트업 시 운영 체제(OS)로부터의 초기 메모리 할당을 필요로 하며 최대 메모리 사용 할당량이 있습니다. 자세한 내용은 Oracle 웹사이트의 java.lang.OutOfMemoryError 오류를 참조하십시오. 메모리 값을 조정하려면 JVM 플래그를 사용하십시오. 예를 들어, 다음 명령을 실행하여 -Xms를 사용하여 초기 힙 크기를 설정하고 -Xmx를 사용하여 최대 힙 크기를 설정합니다.

java -Xms512m -Xmx2048m -jar your-app.jar

세부 폐영역 회수(GC) 로깅을 활성화하려면 Java 명령에 다음 JVM 인수를 추가하십시오.

-verbose:gc -Xlog:gc*:file=log_filename:time,uptime:filecount=num_files,filesize=file_sizem

자세한 내용은 Oracle 웹사이트의 폐영역 회수 로그를 참조하십시오.

고급 메모리 진단을 위해 jcmd 또는 jmap을 사용하여 힙 덤프를 생성하고 JDK Mission Control 또는 VisualVM과 같은 분석 도구를 생성하십시오. 자세한 내용은 Oracle 웹사이트의 진단 데이터분석 도구를 참조하십시오.

Node.js 애플리케이션

다음 v8.getHeapStatistics() 모듈을 사용하여 기본 힙 메모리 할당량을 확인하십시오.

const v8 = require('v8');
console.log(v8.getHeapStatistics());

자세한 내용은 Node.js 웹사이트의 v8.GetHeapStatistics()를 참조하십시오.

힙 크기 할당량을 늘리려면 애플리케이션을 실행할 때**--max-old-space-size** 파라미터를 사용하십시오.

node --max-old-space-size=4096 app.js

참고: 위 명령은 4기가바이트(GB) 힙 할당량을 설정합니다. 기본 힙 메모리 크기는 Node.js 버전마다 다를 수 있습니다. 자세한 내용은 Node.js 웹사이트의 --max-old-space-size=SIZE (MiB 단위)를 참조하십시오.

폐영역 회수를 추적하려면 노드 프로세스에 다음 플래그를 추가합니다.

node --trace-gc server.js

자세한 내용은 Node.js 웹사이트의 폐영역 회수 추적을 참조하십시오.

심층적인 메모리 진단을 위해 --heap-prof와 같은 Node.js V8 내장 프로파일러를 사용하여 힙 스냅샷을 생성합니다. 또는**--heapsnapshot-signal**을 사용하여 Linux 신호를 통해 힙 스냅샷을 생성합니다. 자세한 내용은 Node.js 웹사이트의 \ --heap-prof힙 스냅샷 사용을 참조하십시오.

서비스의 규모를 조정하여 서비스 수준의 메모리 사용 최적화

서비스 수준의 메모리 사용을 최적화하려면 리소스 할당을 모니터링 및 조정하여 메모리 사용 패턴에 따라 작업의 규모를 조정합니다. 서비스 작업에 사용되는 총 메모리를 계산합니다. 그런 다음 메모리 요구 사항에 따라 서비스에서 원하는 작업 값을 수동으로 조정합니다.

또는 메모리 사용 지표에 따라 서비스 규모 조정 정책을 사용합니다. 스케일 아웃 및 스케일 인을 수행할 수 있도록 임계값과 함께 규모 조정 정책을 구성합니다.

향후 OutofMemory 오류 방지

향후 OutOfMemory 오류를 방지하려면 호스트 또는 서버 내 컨테이너에서 부하 테스트를 수행하여 애플리케이션의 메모리 요구 사항을 파악하십시오. 테스트할 때 Docker 컨테이너 통계를 사용하여 컨테이너의 메모리 사용량을 모니터링하십시오. 자세한 내용은 Docker 웹사이트의 Docker 컨테이너 통계를 참조하십시오.

컨테이너 구성을 업데이트하려면 다음 작업을 수행하십시오.

  • 데이터 구조를 관리합니다.
  • 불필요한 객체 생성을 피합니다.
  • 캐싱을 구현합니다.
  • 효율적인 알고리즘을 사용하여 메모리 사용량을 줄입니다.

관련 정보

컨테이너가 종료될 때 Amazon ECS 작업이 중단되거나 시작되지 않는 문제를 해결하려면 어떻게 해야 합니까?

AWS 공식업데이트됨 4달 전