AWS Lambda coldstart 줄이는 방법

Hoony·2022년 6월 30일
1

AWS Lambda의 동작과정과 coldstart

AWS Lambda는 아래와 같은 과정으로 동작한다.

  • Load code - 코드 다운로드
  • Create Container - 런타임 환경을 만듦
  • Bootstrap - 컴파일 및 코드 적재
  • Invocation - 코드 실행

이 과정 중, 코드를 다운로드 받고, 컨테이너를 만드는 시간을 Coldstart라고 불린다.

람다는 처음 동작할 때 coldstart로 인해 지연 시간이 발생한다.

하지만, 일정 시간 안에 다시 호출하면 컨테이너가 살아있는 동안은 coldstart가 없다.

어떻게 줄일 수 있을까?

Warmer

람다가 실행되고나서 10~15분정도는 컨테이너가 꺼지지 않는다.
그렇기 때문에 5분마다 한번씩 람다를 호출하여 꺼지지 않는 상태를 유지할 수 있다.
관리해야할 람다가 늘어날수록 호출 비용, 관리 비용들이 증가하게 된다.

Provisioned Concurrency

Lambda가 구동될 Container를 특정 수치만큼 유지하는 옵션이다. Container가 살아 있기 때문에, 람다가 호출되어도 Coldstart가 발생하지 않는다. 하지만, 동시에 일정 수치 이상의 호출이 되면 새로운 Container가 필요하기 때문에 coldstart가 완벽하게 사라진다고 할 수는 없다. EC2를 켜두는 것과 같은 효과이기 때문에 비용이 많이 나온다는 단점이 있다.

Memory Size Up

AWS에서 직접적으로 말한 내용은 아니지만, Lambda의 메모리가 커질수록 제공되는 컴퓨팅환경이 더 좋다는 말이 있다. 메모리 128MB로 설정되어있던 람다를 10기가 메모리로 변경하니 coldstart가 있는 기준으로 1초이상 걸리던 Lambda가500~600ms이내로 동작 하는 것을 확인했다. cpu를 더 많이 사용하여 연산이 빨라져서 그런지는 정확하지는 않다. 결론적으로는 비용은 비슷했다.

Lambda Layer

Lambda로 코드를 작성하면 aws-sdk, pg 등 다양한 Module들이 사용된다. 보통 이러한 모듈들이 code와 함께 packing되어 올라간다. 하지만 lambda마다 각각 모듈을 가지고 있지 않아도 되게 하는 기능이다. Lambda에 사용되는 모듈들만 따로 모아서 Lambda Layer에 올려둘 수 있고 Labmda는 어떤 Layer를 참조할지 정하기만 하면 된다. 이렇게 설정하면 Lambda는 코드만 배포되어 다운로드하는 시간이 대폭 줄어든다.

아래 링크의 실험 결과에 따르면, 큰 차이가 없다고 한다.
https://medium.com/consulner/performance-of-aws-lambda-with-and-without-layers-9bffbb5434f3

Language

어떤 언어로 개발을 하느냐가 coldstart에 많은 영향을 준다. java와 C#의 경우에는 JVM/.NET이 필요하기 때문에 python/javascript에 비해 coldstart시간이 상대적으로 길다. 작은 메모리에서는 더 큰 차이가 존재하고 개인적으로는 7초 이상의 시간이 걸렸던 적이 있다. 람다로 API를 작성한다면 가급적 Python이나 javascript가 좋다.


더 좋은 방법이 있으면 공유해주세요.
잘못된 글이 있다면 바로 잡아주세요.

profile
아는 만큼 보인다

1개의 댓글

comment-user-thumbnail
2024년 1월 6일

죽기 전에 요청을 보내요
aws를 사용하는 넷플릭스의 방식으로 유명해졌어요

답글 달기