EC2와 Docker 환경에서 NestJS 어플리케이션의 'JavaScript heap out of memory' 문제 해결
안녕하세요 여러분, 오늘은 RAM이 2GB로 설정된 t2.small AWS EC2에 Docker로 배포한 NestJS 어플리케이션에서 JavaScript heap out of memory 오류를 마주했을 때의 경험과 해결 방안에 대해 이야기하려 합니다.
1. 오류 코드
docker로 이미지화된 NestJS 애플리케이션을 실행시켰을 떄 다음과 같은 오류 메시지가 발생했습니다
<--- Last few GCs --->
[19:0x65441a0] 53911 ms: Mark-sweep (reduce) 977.0 (1000.1) -> 975.4 (995.6) MB, 1180.0 / 0.0 ms (+ 292.9 ms in 55 steps since start of marking, biggest step 42.8 ms, walltime since start of marking 1684 ms) (average mu = 0.328, current mu = 0.285) al[19:0x65441a0] 55351 ms: Mark-sweep (reduce) 976.3 (995.6) -> 974.4 (995.8) MB, 1415.2 / 0.0 ms (average mu = 0.199, current mu = 0.018) allocation failure GC in old space requested
<--- JS stacktrace --->
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
1: 0xb090e0 node::Abort() [node]
2: 0xa1b70e [node]
3: 0xce1a20 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
4: 0xce1dc7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
5: 0xe99435 [node]
6: 0xea90fd v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
7: 0xeabdfe v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
8: 0xe6d072 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [node]
9: 0xe65684 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawWithImmortalMap(int, v8::internal::AllocationType, v8::internal::Map, v8::internal::AllocationAlignment) [node]
10: 0xe667f1 v8::internal::FactoryBase<v8::internal::Factory>::NewByteArray(int, v8::internal::AllocationType) [node]
11: 0xde4c43 v8::internal::TranslationArrayBuilder::ToTranslationArray(v8::internal::Factory*) [node]
12: 0x1c19e66 v8::internal::compiler::CodeGenerator::GenerateDeoptimizationData() [node]
13: 0x1c1a575 v8::internal::compiler::CodeGenerator::FinalizeCode() [node]
14: 0x1ca2a31 v8::internal::compiler::PipelineImpl::FinalizeCode(bool) [node]
15: 0x1ca3a33 v8::internal::compiler::PipelineCompilationJob::FinalizeJobImpl(v8::internal::Isolate*) [node]
16: 0xd79390 v8::internal::OptimizedCompilationJob::FinalizeJob(v8::internal::Isolate*) [node]
17: 0xd7df4b v8::internal::Compiler::FinalizeOptimizedCompilationJob(v8::internal::OptimizedCompilationJob*, v8::internal::Isolate*) [node]
18: 0xda0253 v8::internal::OptimizingCompileDispatcher::InstallOptimizedFunctions() [node]
19: 0xe39287 v8::internal::StackGuard::HandleInterrupts() [node]
20: 0x11e5ab4 v8::internal::Runtime_StackGuardWithGap(int, unsigned long*, v8::internal::Isolate*) [node]
21: 0x15d9e59 [node]
2. 문제의 시작
이 오류 메시지는 꽤나 자세하게 문제 상황을 나타냅니다. 어플리케이션이 할당된 힙 메모리를 모두 소비했을 때 발생합니다. 즉, 애플리케이션이 사용할 수 있는 메모리 양을 초과해서 메모리가 부족한 상태가 된 것입니다.
3. 스왑 메모리를 통한 문제 해결
메모리 부족의 문제를 해결하는 한 가지 방법은 서버에 스왑 메모리(swap memory)를 추가하는 것입니다. 스왑 메모리는 디스크의 일부를 RAM처럼 사용하여 시스템이 물리적 메모리를 초과하여 메모리를 필요로 할 때 이를 보완하는 역할을 합니다.
다음은 EC2 인스턴스에서 스왑 메모리를 추가하는 과정입니다:
- 먼저, 스왑 파일을 생성합니다.
- 128M * 16 = 2GB
- 128M * 32 = 4GB
sudo dd if=/dev/zero of=/swapfile bs=128M count=30
- 생성한 스왑 파일의 권한을 설정합니다.
sudo chmod 600 /swapfile
- 스왑 공간으로 설정합니다.
sudo mkswap /swapfile
- 스왑 메모리를 활성화합니다.
sudo swapon /swapfile
- 재부팅 시에도 스왑 메모리가 활성화되도록 /etc/fstab 파일에 다음 줄을 추가합니다.
/swapfile swap swap defaults 0 0
이렇게 설정 후, free -h 명령어로 스왑 메모리가 제대로 활성화되었는지 확인할 수 있습니다.
4. 마치며
메모리 부족 문제는 성능 최적화, 적절한 자원 할당, 코드 최적화 등 다양한 방법으로 해결할 수 있습니다. 여기서 제시한 방법은 임시적인 해결책 중 하나일 뿐, 장기적으로는 어플리케이션의 메모리 사용 패턴을 분석하고, 필요한 최적화 작업을 통해 근본적인 해결을 추구해야 합니다.
여러분도 비슷한 문제를 겪었을 때, 위의 방법으로 문제를 해결해 볼 수 있기를 바랍니다. 행운을 빕니다! 🍀
'개발 > AWS' 카테고리의 다른 글
AWS EC2, RDS 연결하기 :: VPC와 함께하는 NestJS 백엔드 배포, Prisma Migrate 문제 해결 (2) | 2023.10.04 |
---|---|
AWS EC2 인스턴스 지역 변경하기 (AMI 이미지 사용하기), Amazon Machine Image (0) | 2023.10.04 |
AWS EC2, Route 53과 가비아를 활용한 NestJS 서비스 SSL 인증서 적용 방법 (0) | 2023.10.03 |
NestJs에서 AWS S3 연동 시 발생하는 'CredentialsProviderError' 오류 해결하기 (2) | 2023.10.01 |
AWS S3에서 'AccessControlListNotSupported' 오류 해결하기 (0) | 2023.10.01 |