스터디/AWS

AWS 느린 Lambda 빠르게 바꾸기 (Delay!! Cold-Start / Warm-Start)

Dalmangyi 2022. 7. 24.

무지성 백앤드 개발자가 된지 4개월..

어느정도 적응을 해나가니 최적화를 해나가야할 부분들이 눈에 밟히기 시작합니다.. 

 

이번 게시글에서는 불편함이 무엇이고 그걸 어떻게 해결해나가야 할지 다뤄보겠습니다. 

 

 

 

느린 호출의 이유, 빠르게 호출하려면?, 가성비 호출방법에 대해서 배워보겠습니다.

 

 

1. 생각보다 느린 첫 호출.

 

저는 aws 람다를 python 3.8 환경에서 개발을 해보고 있습니다. 

그렇게 테스트를 하던 도중.

람다 함수를 사용을 하지 않다가 오랜만에 사용하면 반응이 느린걸 알아냈습니다.

대략 1.4초 정도 차이나는걸 느꼈습니다.  

 

 

람다는 서버리스 형태로 되어 있어서, 항시 가동되는 서비스가 아니기 때문에

오랜만에 호출하면, 죽어있던 람다로 할당된 컴퓨터가 잠시 살아나는 과정이 필요한것이였죠. 

 

그리고 그 람다가 살아날땐 메모리 슬립 상태로 꺼진것이 아니기 때문에

람다가 할당된 컴퓨터 부팅부터, 람다에 포함시켜놓은 라이브러리(Layer) 실행 등,

언어마다 다른 시간이 필요했었습니다.

 

이런 느린 실행을 'Cold Start(콜드 스타트)'라고 부릅니다.

자동차 내연기관 엔진을 추운곳에서 시동을 걸면 시동이 오래걸리는데서 비유한거 같습니다. 

그리고 종료된지 얼마 안 되서 다시 시작할땐 빨리 켜진다는 표현에서 온 'Warm Start(웜 스타트)'라고 부릅니다.

 

aws

콜드스타트 : 소스코드 다운되고, 콘테이너가 실행됨.

일부 콜드 스타트 : 부트스트랩 런타임

웜 스타트 : 소스코드가 실행되는 부분

 

 

언어마다 다른 시간이 필요한 이유는 컴퓨터에서 개발 프로그램을 구동시켰을때를 생각해보면 바로 감이 옵니다.

물론 다른 언어를 안해보신 분들도 많으니 자료를 준비해봤습니다.

https://mikhail.io/serverless/coldstarts/aws/

그래프를 보시면 콜드스타트가 얼마나 오래걸리는지 희미한 색상으로 나오고, 

웜스타트가 콜드스타트에 비해 얼마나 빠른지 진한색상으로 표현해 주고 있습니다.

콜드스타트를 보자면 자바스크립트는 대략 0.25초~0.6초, 파이썬은 대략 0.2초~0.6초, 도커는 대략 0.6초~ 1.4초 까지 다양합니다.

 

 

 

 

 

 

 

 

 

 

 

2. 콜드 스타트를 줄이려면.  지속적힌 호출뿐!

 

시동이 잘 안 걸리는 겨울...

엔진을 장시간 사용하지 않아서 차가워지지 않게 하려면 

지속적으로 시동을 걸고 있어줘야 합니다.

 

람다도 마찬가지 인데, 방법은 람다 함수를 주기적으로 호출되면 항상 웜 스타트 상태로 유지 할 수 있습니다.

 

서버리스를 위해서 만든 람다인데, 지속적으로 실행시켜줄려면 서버가 필요한거 아냐? 라고 할 수 있겠지만,

모든것이 귀찮은 저에겐 그조차도 귀찮아서 조금 검색해보니 좋은 방법을 aws에서 구축해 놓았었습니다.

(이러라고 구현해놓은건 아닌거 같습니다)

 

바로 이벤트 브릿지(Event Bridge)인데요

https://aws.amazon.com/ko/eventbridge/

(원래는 클라우드 워치 내에 있던 기능같은데, 사람들이 너무 기능을 자주 쓰다보니 따로 서비스를 만든거 같습니다.)

 

위 사진처럼 lambda-warmer라고 이름을 짓고, 규칙 유형을 '일정'으로 선택해 줍니다.

그리고 너무 고맙게도 저희가 원하는 지속적인 호출 시간을 정할 수 있습니다.

lambda가 슬립하는 경우는 5~7분 정도가 지났을때 이뤄지기 때문에, 5분마다 반복해서 호출해야합니다.

그리고 aws 서비스 중에 내가 만든 Lambda를 정확히 선택해서 호출 해줄 수 있습니다.

 

 

이벤트브릿지로 슬립하려는 람다를 항상 5분간격으로 깨워서 항시 대기로 만들 수 있습니다. (거의 고문수준;;)

이럼에도 불구하고, 모든 람다를 이벤트 브릿지로 등록하는건 너~무 너무 귀찮으니, 

1개의 람다를 지속적으로 깨워주고, 그 람다 안에서는 다른 람다들을 깨워주는걸로 개발하는게 좋을듯합니다. 

 

 

 

 

 

3. 성능 이슈

람다를 사용하면서 동영상 인코딩이나, 이미지 프로세싱을 해야될 일이 있었는데.

생각보다 느린 퍼포먼스와 가끔 실행되지 않는 문제를 겪곤 했습니다. 

이런 상황이 일어나는 일은 당연하지만, 처음 해보는 백엔드 개발자가 알아차리기란.. 조큼 시간이 필요했었습니다.

람다를 구동하는 서버의 성능을 생각하지 않고 있었던 것이였죠...

 

[ 람다 > 구성 > 기본설정 ] 으로 접속하면 람다의 성능을 할당 할 수 있습니다. 

메모리를 128MB~10240MB까지 설정할 수 있으며, "메모리에 비례하는 cpu가 할당됩니다" 라고 써있네요.

그치만 그 cpu가 어느정도 인지는 모릅니다...

 

서울 리전으로 설정하면, 1ms당 가격을 알 수 있습니다. 

 

 

 

 

4. 그렇다면 가성비는??

메모리가 정말 다양하게 제공됩니다. 

그 중 2의 배수가 아닌 이상한 수를 가진 1,536MB(1024+512??)가 눈에 뛰네요.. 

 

각 메모리별 실행시간을 테스트해본 그래프 입니다. 

https://github.com/alexcasalboni/aws-lambda-power-tuning

https://github.com/alexcasalboni/aws-lambda-power-tuning 여길 꼭 들어가보길!

 

1536MB로 설정할 때, 실행시간이 줄고, 거기에 따른 가격도 적당히 줄어서 최고의 가성비 구간이 됩니다.  

그래서 람다를 처음 만들고 정말 테스트용이 아니고서는 128MB 그대로 쓰지 말고, 1536MB로 세팅해서 쓰시는걸 추천드립니다. 

 

 

 

 

 

 

댓글