반응형
본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.
애플리케이션 최적화 방법
1. 컨테이너가 사용할 수 있는 리소스 사용량을 제한
- 일반적인 프로세스는 사용량이 별도로 제한되어 있지 않기에 프로세스 실행 시 하드웨어의 모든 리소스를 사용하게 된다.
- 도커는 가상화이기에 명령어로 사용할 수 있는 리소스를 제한할 수 있다.
그림 1) 컨테이너의 리소스 사용량을 제한하는 명령어
그림 2) 컨테이너 리소스 사용량과 이벤트 로그 조회 명령어
예시 1) nginx 구동 시 리소스 사용량 제한
# 1. 리소스 제약이 없는 상태로 컨테이너 실행
docker run --help
# nginx 컨테이너 실행
docker run -d --name no-limit nginx
# 2. 컨테이너의 메타데이터 확인
# 컨테이너 inspect 명령 중 Memory, Cpus 문자 필터링
docker inspect no-limit | grep -e Memory -e Cpus
# 메모리와 CPU 제한이 없는 것을 확인할 수 있다.
# 3. 리소스 제약이 있는 상태로 컨테이너 실행 (0.5 Core / 256M Memory)
docker run -d --name with-limit --cpus=0.5 --memory=256M nginx
# 4. 컨테이너의 메타데이터 확인
docker inspect no-limit | grep -e Memory -e Cpus
# 메모리와 CPU 제한이 있는 것을 확인할 수 있다.
# 5. 실습 컨테이너 삭제
docker rm -f no-limit with-limit
컨테이너 리소스 사용량 제한시 주의점
1. LIMIT에 지정한 CPU보다 사용량이 초과되면 CPU 스로틀링 발생
- 컨테이너에 설정된 CPU LIMIT을 초과하는 CPU 사용이 감지되면 시스템은 컨테이너의 CPU 사용을 제한한다.
- 애플리케이션의 성능 저하가 발생한다.
2. LIMIT에 지정한 MEMORY보다 사용량이 초과할 경우
- OOM(Out Of Memory) Killer 프로세스가 실행되고 컨테이너가 강제로 종료된다.
예시 2) 메모리 사용량이 초과될 경우 에러 확인
# 2. 리소스 사용량이 10MB이상을 사용하는 컨테이너 실행
docker run -d --name memoryuse devwikirepo/memoryuse
docker stats
# 3. 동일한 컨테이너로 10MB로 리소스 사용량 제약을 준 후 실행
docker run -d --name memoryuse-withlimit --memory=10M devwikirepo/memoryuse
# 4. 컨테이너의 상태 조회
# 리소스 사용량 증가에 따라 3.에서 리소스 사용량에 제약을 준 컨테이너는 종료된다.
docker ps
# 5.실습 컨테이너 삭제
docker rm -f memoryuse-withlimit memoryuse with-limit no-limits
예시 3) 예시 2에서 실행한 명령어로 인한 컨테이너의 상태 확인
# 1. 이벤트 로그 조회
docker events
====> 실습종료
예시 4) leafy 애플리케이션 구동 시 리소스 사용량 제한
docker run -d --cpus=1 --memory=256m --name leafy-postgres -v mydata:/var/lib/postgresql/data --network leafy-network devwikirepo/leafy-postgres:1.0.0
docker run -d --cpus=1.5 --memory=512m -e DB_URL=leafy-postgres --name leafy --network leafy-network devwikirepo/leafy-backend:1.0.0
docker run -d --cpus=0.5 --memory=64m -e BACKEND_HOST=leafy -p 80:80 --name leafy-front --network leafy-network leafy-front:4.0.0-env
2. 자바 가상 머신(JVM) 튜닝
- 자바 애플리케이션이 사용할 수 있는 메모리 영역인 힙 메모리를 별도로 관리해야 한다.
- 전체 서버 메모리의 50~80%를 힙 메모리의 사용량으로 정하는 것이 일반적이다.
- 힙 메모리 설정 시 컨테이너의 limit 값도 신경써야 하고 Dockerfile에 자동 조정 기능을 설정할 있다.
- JRE(Java Runtime Environment)에서 java -jar 명령어로 app.jar 파일을 실행 시킬 때 JVM 위에서 애플리케이션이 실행되므로 JVM 설정을 올바르게 세팅해야 한다.
그림 3) 힙 메모리의 최대값을 지정하는 명령어
예시 5) easydocker/leafy/leafy-backend/Dockerfile
... (빌드 부분 생략)
FROM openjdk:8-jre-alpine
# JVM 튜닝을 위한 환경 변수 추가
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"
# JVM의 Heap 메모리를 컨테이너에 할당된 메모리에 맞추어 자동으로 조절한다.
# (Java 8u131 부터 지원, Java 10 이상에서는 기본 활성화)
WORKDIR /app
COPY --from=build /app/build/libs/*.jar /app/leafy.jar
EXPOSE 8080
ENTRYPOINT ["java"]
CMD ["-jar", "leafy.jar"]
반응형
'Docker' 카테고리의 다른 글
[Docker] Docker Compose (0) | 2024.07.19 |
---|---|
[Docker] 도커 실무(컨테이너 내부에서 개발환경 구성) (0) | 2024.07.19 |
[Docker] 도커 실무(PostgreSQL 이중화 DB 구성) (0) | 2024.07.19 |
[Docker] 도커 실무(동적 서버 구성) (0) | 2024.07.19 |
[Docker] 도커 실무(3 Tier 아키텍처 구성) (0) | 2024.07.19 |