실전 프로젝트 5주차. 오늘은 서버 인스턴스의 아키텍쳐를 변경해서 적용해봤다.
지금까지 사용했던 EC2 인스턴스는 x86기반의 t3.small을 사용하고 있었다.
그런데 어제 서버에 대해서 알아보다가 t4g.small이 시간당 가격도 20% 정도 더 저렴하고, 성능도 20% 정도 더 좋다는 aws의 문서를 봤다. 가격도 낮고 성능도 더 좋다니 안 쓸 이유가 없어서 바로 도입을 시도해보았다.
우선 t3는 intel의 x86 기반 아키텍쳐이고, t4g는 Graviton2 arm 기반 아키텍쳐라서 바로 적용이 안되었다.
일단 t4g 인스턴스를 새로 하나 생성해서 Docker와 CodeDeploy를 받아 AMI를 arm용으로 새로 생성했다.
수동으로 이미지를 빌드할 땐
docker build --platform linux/arm64 -t 유저이름/이미지이름 .
으로 플랫폼을 바꿔서 빌드가 가능했다.
CI/CD를 적용하는데서 어려움이 좀 있었는데 Github Actions가 amd64 x86 기반의 아키텍쳐라서 빌드를 할 때 추가 설정이 없으면 arm64로 빌드가 되질 않았다.
알아보니 buildx와 QEMU 에뮬레이터가 필요했다.
docker buildx는 멀티 아키텍처 이미지를 빌드할 때 사용하는 도구로 여러 플랫폼에 대한 이미지를 동시에 빌드하고 푸시할 수 있다. 그리고 QEMU는 다른 아키텍처의 바이너리를 실행할 수 있도록 해주는 에뮬레이터로 여기서는 QEMU를 사용하여 arm64 이미지를 amd64 기반 시스템에서 빌드할 수 있게 해준다.
CI/CD yaml파일에서 Gradle로 빌드 후 Buildx와 QEMU 설치 단계를 넣었다.
# Gradle 빌드 후
# Buildx 설치
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
# QEMU 에뮬레이터 설치
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
# Docker 로그인
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_PASSWORD }}
# Dockerhub에 빌드&푸시
- name: Build and push Docker Image
uses: docker/build-push-action@v2
with:
context: .
push: true
platforms: linux/arm64
tags: ${{ env.DOCKER_USERNAME }}/이미지 이름:latest
맨 아래의 platforms를 linux/arm64,linux/amd64
처럼 지정하면 멀티 플랫폼 이미지로 여러 환경에서 실행시킬 수도 있다.
linux/amd64: 대부분의 데스크톱과 서버에 사용되는 일반적인 x86-64 아키텍처에 대한 리눅스 이미지
linux/arm64: ARM 기반 64비트 시스템에 대한 리눅스 이미지. Raspberry Pi 3 Model B+ 이후의 모델과 AWS Graviton 프로세서 기반 인스턴스에 사용된다.
위의 과정으로 t3를 t4g로 변경하고 싱글 인스턴스기준 tps가 400 후반 대에서 500 후반대로 tps 100정도의 성능 향상이 있었다.
arm 아키텍쳐와 x86 아키텍쳐에 대한 이해도 필요할 것 같은데, 이 부분은 추후 TIL에 정리해보도록 하자.