컨테이너는 어떻게 최적화를 할까?
컨테이너 최적화
--
모든 애플리케이션은 CPU와 메모리를 사용한다.
일반적인 프로세스는 사용량이 별도로 제한되어 있지 않기 때문에
프로세스를 실행시키면 하드웨어의 모든 리소스를 사용할 수 있다.
다만 도커는 가상화 기술이고
컨테이너는 격리된 공간에서 실행하기 때문에
프로세스가 사용할 수 있는 리소스를 제한할 수 있다.
컨테이너의 사용 가능 리소스를 제한하는 방법은
"docker run" 명령어로 컨테이너를 실행할 때 옵션으로 제한할 수 있다.
컨테이너의 최대 CPU(코어) 사용량 제한하는 옵션 (단위는 코어 개수)
--cpus=CPU코어수
컨테이너의 최대 메모리 사용량 제한하는 옵션 (단위는 B, K, M, G로 메모리 용량 뒤에 작성하면 된다.)
--memory=메모리용량
nginx 이미지를 리소스 제한 없는 컨테이너로 실행시키는 명령어
docker run -d --name no-limit nginx
컨테이너의 세부 정보를 조회하는데 "Memory", "Cpus" 문자열이 포함되어 있는 정보만 조회하는 명령어
docker inspect no-limit | grep -e Memory -e Cpus
0은 제한이 없다는 것을 의미한다.
0.5코어, 256메가로 리소스 제한을 둔 컨테이너 실행하는 명령어
docker run -d --name with-limit --cpus=0.5 --memory=256M nginx
다시 컨테이너 세부 정보 조회하기
docker inspect no-limit | grep -e Memory -e Cpus
표시되는 단위는 byte이다.
지정된 CPU보다 사용량이 초과하게 된다면 CPU 스로톨링이 발생한다.
CPU 스로톨링은
시스템이 애플리케이션의 CPU 사용을 제한하는 것
그래서 CPU 사용량을 초과하게 되면 실행 중인 애플리케이션의 처리 속도가 감소하게 된다.
지정된 메모리보다 사용량이 초과하게 된다면
OOM Killer 프로세스가 실행하게 되고 컨테이너는 강제 종료된다.
OOM(Out Of Memory) Killer는
프로세스를 강제로 종료하는 프로세스다.
--
자바로 구현된 애플리케이션 컨테이너
--
자바 애플리케이션은 기본적으로 JVM 런타임 환경에서 실행된다.
JVM 런타임 환경에서 사용하는 메모리는 다양하게 있는데
이 중에서 애플리케이션의 사용량 증가에 따라서 가장 크게 변화하는 것은 메모리 영역의 힙(Heep) 메모리다.
힙(Heep) 메모리란?
자바 애플리케이션이 실행될 때 자바의 객체가 동적으로 할당되는 공간
객체가 많이 사용될수록 힙 메모리 영역도 많이 사용하게 되어
보통 애플리케이션이 실행될 때 힙 메모리의 사용량을 지정해줘야 한다.
힙 메모리는
보통 전체 서버(PC) 메모리의 50% ~ 80% 를 힙 메모리 사용량으로 설정하는 것이 일반적이다.
힙 메모리 사용량을 지정하는 방법은
자바 애플리케이션을 실행할 때 "Xmx"라는 옵션으로 힙 메모리의 최대 값 사용량을 지정할 수 있다.
Dockerfile
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"
해당 코드는 컨테이너에서 애플리케이션을 실행할 때
해당 컨테이너의 제한 값을 인식해서 자동으로 힙 메모리를 조정하여 최대 값을 지정해 준다.
다만 해당 옵션은 java 10 버전 이상부터 기본으로 활성화가 되어 있기 때문에
java 10 버전 이상을 사용 중이라면 생략해도 된다.
--
참고 및 출처
'Docker' 카테고리의 다른 글
도커 컴포즈 (Docker Compose) (0) | 2024.07.03 |
---|---|
3Tier 아키텍처 구성 방법 (+Nginx 설정) (0) | 2024.07.01 |
이미지 빌드시 캐싱 활용하기 (0) | 2024.06.30 |
이미지 레이어 관리하기 (0) | 2024.06.29 |
도커 볼륨, 마운트, 바인드 마운트 (+명령어) (0) | 2024.06.28 |