Web/Node.JS

Lambda에서 Fargate로 Node.js 성능 최적화를 위한 적절한 설정 찾기

이영훈닷컴 2025. 3. 31. 09:35
728x90

최근 우리는 Node.js(NestJS)를 기반으로 한 애플리케이션의 성능을 최적화하기 위해 Lambda에서 Fargate로 마이그레이션을 진행했습니다. 이 과정에서 다양한 CPU와 메모리 설정(Task Spec)을 실험하며 최적의 구성을 찾는 여정을 겪었는데요. 그 결과를 공유하려 합니다.

Lambda와 Fargate의 차이점

처음에는 Lambda를 사용했습니다. Lambda는 요청마다 새로운 환경이 생성되므로 리소스 경합이 없고, 짧은 프로세스 처리와 자동 확장 기능에서 효율적이었습니다. 하지만 대량 데이터 처리나 장시간 배치 작업에서는 콜드 스타트 문제와 30초 제한 시간 초과와 같은 한계를 경험했습니다. 그래서 우리는 더 유연한 리소스 관리가 가능한 Fargate로 전환했습니다.

Fargate에서의 경험: 최적의 Task Spec 찾기

Fargate의 가장 큰 장점은 CPU와 메모리 리소스를 세밀하게 조정할 수 있다는 점입니다. 하지만 Node.js는 단일 스레드 기반으로 동작하기 때문에 적절한 설정을 찾는 데 많은 시행착오가 있었습니다.

1vCPU 2048MB 설정

처음에는 이 구성을 사용했지만 Node.js의 기본 힙 메모리 한계로 인해 대량 데이터 처리 시 메모리 부족 문제가 발생했습니다. 잦은 가비지 컬렉션으로 인해 성능이 불안정해지고 작업이 자주 중단되었습니다.

2vCPU 4096MB 설정

CPU와 메모리를 두 배로 늘린 후, 성능이 크게 개선되었습니다. 단일 스레드 기반의 Node.js에 이 설정은 가장 적합했으며, 가비지 컬렉션과 I/O 작업을 별도의 코어에서 처리하면서 처리량이 크게 향상되었습니다. 이 설정이 우리의 기본 선택이 되었습니다.

4vCPU 8184MB 설정

더 많은 리소스를 할당하면 지연 시간이 줄어들 것이라고 생각해 4vCPU로 늘렸지만, 이는 오히려 성능 저하를 초래했습니다. Node.js가 단일 스레드로 동작하기 때문에 추가 CPU 리소스가 활용되지 않아 오버헤드만 증가했습니다. 이를 통해 과도한 리소스 할당이 오히려 성능에 부정적인 영향을 미칠 수 있다는 점을 배웠습니다.

자동 확장(Auto Scaling) 설정

Fargate 사용 시 가장 중요한 것은 작업 수를 동적으로 조정하는 Autoscaling입니다. 우리는 CPU 사용률이 60%를 초과할 때 작업을 추가하고, 60% 미만일 때 작업을 줄이는 규칙을 설정했습니다. 작업 수는 1에서 10 사이로 조정되며, 이는 성능 유지와 비용 절감 사이의 균형을 맞추는 데 매우 효과적이었습니다.

결론

Lambda에서 Fargate로 전환하며 얻은 가장 큰 교훈은 리소스 관리를 스스로 제어해야 한다는 점입니다. 특히 Node.js 애플리케이션의 경우, 과도한 리소스 할당은 성능을 저하시킬 수 있습니다. 적절한 Task Spec 설정과 효율적인 Autoscaling 활용을 통해 우리는 리소스를 효율적으로 관리하고 비용을 절감할 수 있었습니다.

728x90