YUDA't

버블정렬, 삽입정렬 등 각 정렬별 실행 시간을 출력하는 Lambda 함수를 API Gateway로 트리거해 가져오는데 이상한 점을 발견했다.

시간이 너무 오래 걸렸다.

처음엔 내가 코드를 잘못 짠 줄 알고 고치려 했는데 버블정렬 같은 경우는 너무 간단해서 딱히 잘못될 게 없어보였다.

무엇보다 똑같은 코드가 로컬에서는 제속도로 돌아가니...문제는 Lambda에 있다고 생각해 구글링을 해봤다.


가장 위에 뜨는 포스팅이 "My Accidental 3–5x Speed Increase of AWS Lambda Functions"여서 읽어봤다.(글이 재밌으니 읽는 것을 추천)

포스팅 첫 줄이 이렇다.

Allocate to your function as much memory as your wallet can allow.

그렇다. Lambda를 사용할 땐 되도록 많은 메모리를 사용하는 것이 좋다(돈 문제만 해결된다면). 왜냐하면 Lambda에서는 할당되는 메모리 크기에 따라 CPU의 성능이 바뀌기 때문이다!


Q: How are compute resources assigned to an AWS Lambda function?

… choosing 256MB of memory allocates approximately twice as much CPU power to your Lambda function as requesting 128MB of memory and half as much CPU power as choosing 512MB of memory.

내 Lambda 함수는 기본값 그대로 메모리가 128MB였고, 그래서 함수에서 사용된 메모리가 55MB밖에 안 되었는데도 로컬에서보다 10배 정도 느렸던 것.




어쨌든 원인을 알았으니 수정해야지. 

로컬에서는 버블정렬이 '역방향으로 정렬되어 있는 1000개의 수'를 정렬하는 데에 0.1659초 정도가 걸렸다.

AWS Lambda에서 메모리를 바꿔가며 테스트해본 결과는 이렇다.


128MB 1.6752s

256MB 0.8092s

512MB 0.3721s

1024MB 0.1880s

2048MB 0.1337s

3008MB 0.1063s


1024MB까지는 메모리가 두 배 늘어날 때마다 속도가 거의 두 배씩 빨라진다.

당연히 메모리 설정값이 클수록 쓸 수 있는 프리티어 시간도 짧고, 시간당 요금도 많다.(Lambda 요금 참고)

위에 참고한 블로거가 말했듯이 지갑이 허락하는 한 많은 메모리를 사용하는 게 유리하겠지만 일단 무난하게 1024MB로 설정해두었다.3008무서워요!!!



참고:

https://serverless.zone/my-accidental-3-5x-speed-increase-of-aws-lambda-functions-6d95351197f3

https://aws.amazon.com/ko/lambda/features/

https://aws.amazon.com/ko/lambda/pricing/