본문 바로가기
AWS

[AWS] ARM64 vs x86

by Nhahan 2024. 4. 20.

AWS 서비스를 띄울 때 ARM64와 x86 중 하나를 선택할 수 있다.

그럼 어떤 것을 선택하는 것이 좋을까?

 

결론부터 말하자면,

대체로 ARM64를 선택하는 것이 좋다.

 

 

AWS 제공

 

AWS의 벤치마크에 따르면 전체적으로 ARM 기반 아키텍쳐가 성능이 우수한 것으로 나타났다.

x86 대비 ARM의 performance가 120% 우수했으며, cost는 x86대비 70%에 불과했다. 그리고 가성비 측면에서도 x86 대비 150% 나은 결과가 나왔다.

 

Lambda에서 ARM 아키텍쳐를 초창기(2020~2021)에는 Python, Ruby, Node만 지원했다. 2021.12월 부터 Java를 비롯한 다른 언어들도 지원 시작.

 

특히 파이썬에서 두드러지는 성능 향상을 볼 수 있다.

그러나 ARM이 100% 장점만 있는 것은 아니다.

 

 

동일한 사양에서 CPU 집약적인 작업에서는 ARM이 x86대비 60% 이상의 월등한 퍼포먼스를 보여주었지만, Memory 사용량이 많고 가벼운 작업에서는 성능이 소폭 하락하는 것으로 집계되었다.

 

하지만 그럼에도 불구하고, 여전히 work/$에서 ARM이 유리하므로 결과적으로 놓고 보면 ARM을 쓰는 것이 좋을 것이다.

🤔 6~7%의 성능 하락을 감수하고 13~19%의 cost를 save하는 것이 좋을 것이다... 100만원 나올 것을 80~90만원만 낸다고 하면 체감이 확 된다.

 

 

That specific and probably somewhat-rare case aside, you can easily get an idea of how much money you’re leaving on the table by not migrating to Graviton2-based Lambdas

(표현이 재밌다)

 

AWS에서도 특수하게 드문 케이스를 제외하고는 ARM 아키텍쳐(Graviton)로 이전하지 않으면 큰 금전적 손해를 볼 수 있다고 하고 있다.

 

요약하자면, AWS에서 조차도

"그냥 Arm 쓰세요"

라고 하고 있는 것이다.

 

그러나 Lambda의 default 세팅이 x86이기 때문에 ARM으로 한 번 바꿔주는 것을 항상 의식적으로 해주어야한다.

이는 IaC에서도 알 수 있는데,

 

resource "aws_lambda_function" "xxx_handler" {
  function_name = "xxx-handler-${var.environment}"
  handler       = "xxx-handler.handler"
  runtime       = "nodejs18.x"
  timeout       = 30

  filename         = "${path.module}/lambda.zip"
  source_code_hash = filebase64sha256("${path.module}/lambda.zip")

  vpc_config {
    subnet_ids         = var.private_subnet_ids
    security_group_ids = [aws_security_group.xxx_handler_lambda_sg.id]
  }
  role = aws_iam_role.lambda_execution_role.arn
}
architectures    = ["arm64"]

이와 같은 Terraform 예제를 보면, 아키텍쳐에 대한 명시가 없을 때 default로 x86 Lambda를 생성하게 된다.

 

x86_64라고 표기되어있는 것을 확인 가능

 

 

따라서 x86을 사용하기 싫다면 Lambda 사용 시 ARM 아키텍쳐임을 명시하도록 하자.

resource "aws_lambda_function" "xxx_handler" {
  function_name = "xxx-handler-${var.environment}"
  handler       = "xxx-handler.handler"
  runtime       = "nodejs18.x"
  timeout       = 30

  filename         = "${path.module}/lambda.zip"
  source_code_hash = filebase64sha256("${path.module}/lambda.zip")
  
  architectures    = ["arm64"] // 아키텍쳐 명시

  vpc_config {
    subnet_ids         = var.private_subnet_ids
    security_group_ids = [aws_security_group.xxx_handler_lambda_sg.id]
  }
  role = aws_iam_role.lambda_execution_role.arn
}

 

 

그래서 바꿨습니다!

 

 


 

 

글을 쓰다 문득 떠올랐는데,

예전 회사에서 AWS에서 시니어로 일하다 오신 분이 이런 채팅을 남기신게 있어서 찾아왔다. ㅋㅋ

 

 

 

'AWS' 카테고리의 다른 글

[AWS] EC2 인스턴스 Price Type별 비교  (3) 2024.10.13
[AWS] IAM 요약  (0) 2024.10.09
[AWS] CDK를 처음 접할 때 알면 좋은 것들  (0) 2024.03.08
MFA란?  (0) 2023.01.29
AWS Data Analytics 아는 척하기  (0) 2022.04.18

댓글