민스씨의 일취일장

성능 테스트 | 컨테이너 메모리 제한 설정 본문

Projects/MetaPay

성능 테스트 | 컨테이너 메모리 제한 설정

읻민스 2024. 8. 16. 16:41
반응형

컨테이너 구동 시 메모리 제한 설정에 대한 글로, Github Issue-#12의 일부 내용입니다.

 

단일 엔드포인트 성능 테슽 - /payments · Issue #12 · f-lab-edu/MetaPay

/payments 엔드포인트에 대한 성능테스트를 진행할 것이다. 작업은 "테스트 준비"와 "테스트 수행"으로 이루어져 있다. 세부 항목은 아래와 같다. 테스트 준비 도커 컨테이너 메모리 설정 Grafana Custo

github.com

컨테이너 메모리 제한 설정

성능 테스트에 진행하기 앞서, 컨테이너의 환경을 되도록 일정하게 유지할 필요가 있다. 즉, 변인을 통제하기 위해 서비스 컨테이너의 메모리를 고정(제한) 해보려고 한다.

제한 방법

지금 적용해보려 하는 방법은 두 가지이다.

  1. JVM Heap 메모리 제한
  2. 컨테이너 메모리 제한

JVM Heap 메모리 제한

자바 애플리케이션 수준에서 제한해 볼 수 있는 것이 JVM Heap 메모리이다. Heap 메모리는 프로그램이 구동 중에 사용되고 프로그램 작동에 영향을 미치는 GC의 대상이기 때문에, Heap 메모리 크기를 일정하게 제한을 두는 것만으로도 유의미한 추세를 파악할 수 있을 것으로 기대된다.

  • 제한 방법

도커 파일에서 환경 변수로 설정할 것이다.

ENV JAVA_OPTS="-Xms256m -Xmx512m"

Xms는 초기 힙 메모리 크기이고, Xmx는 최대 힙 메모리 크기이다. 위에서는 초기 힙 메모리를 256MG로, 최대 힙 메모리를 512MG로 설정한 것이다.

컨테이너 메모리 제한

이후 한 번 더 고려해 볼 만한 메모리 제한은 컨테이너의 메모리 제한이다. 힙 메모리 외의 메모리(컨테이너 메모리) 공간도 성능에 직간접적으로 영향을 주기 때문에 컨테이너 메모리도 제한을 할 것이다.

-m 768m --memory-swap 768m

컨테이너 실행 시 위의 옵션을 추가해주면서 컨테이너 메모리를 제한할 수 있다. -m은 컨테이너가 사용할 메모리를 세팅한 것이고, --memory-swap은 추가로 최대 사용가능한 메모리 크기이다. swap을 설정하지 않으면 기본 설정된 메모리의 2배까지 사용가능해진다.

제한 내용 확인

Heap Memory 영역

JVM Heap 메모리 영역은 Grafana jvm_memory_used_bytes 항목으로 확인할 수 있다. 기존 도커 컨테이너를 멈추고, 다시 실행하는 사이 측정이 멈춰있고 다시 그래프가 시작된 것을 확인할 수 있다. 그리고 파란줄이 낮아진 것을 확인할 수 있다.

Grafana 대시보드에서 JVM Heap Memory 영역 사용량을 측정한 결과모습이다.
Grafana 대시보드 모습

Docker Container 메모리 영역

도커 컨테이너가 구동되고 있는 서버(EC2)에 SSH 접속해 아래와 같은 명령어를 입력한다.

docker inspect <container-id> | grep Memory

이에대한 결과로 아래와 같은 결과를 얻었다.

805306368MB를 사용중이라고 나와있다. 실제로 768MB = 768 * 1024 * 1024 =805,306,368 Byte로 정확하게 설정한대로 반영된 모습이다.

728x90
반응형