컨테이너 자원 할당 제한

이주희·2022년 11월 2일
0

Docker

목록 보기
10/16

1. 컨테이너 자원 할당 제한

  • 컨테이너를 생성하는 run, create 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 입력할 수 있다.

1-1. 🧐 자원을 제한하지 않으면?

  • 아무런 옵션을 입력하지 않으면 컨테이너는 호스트의 자원을 제한 없이 쓸 수 있게 설정된다.

  • 호스트의 자원을 전부 점유해 다른 컨테이너들뿐 아니라 호스트 자체의 동작이 멈출 수도 있다.

1-2. 현재 컨테이너에 설정된 자원 제한 확인하기

docker inspect

2. 컨테이너 메모리 제한

docker run -d
--memory="1g"
컨테이너
  • docker run 명령어에 --memory를 지정해 컨테이너의 메모리를 제한할 수 있다.

  • 컨테이너 내에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료된다.

  • 기본적으로 컨테이너의 Swap 메모리는 메모리의 2배로 설정되지만 별도로 지정할 수 있다.

  • 입력할 수 있는 단위는 m(megabyte), g(gigabyte)이다.

  • 제한할 수 있는 최소 메모리는 6MB이다.

    Swap 메모리

    실제 메모리 Ram이 가득 찼지만 더 많은 메모리가 필요할때 디스크 공간을 이용하여 부족한 메모리를 대체할 수 있는 공간


3. 컨테이너 CPU 제한

3-1. --cpu-shares

docker run -i -t
--cpu-shares 1024
컨테이너
  • 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지를 나타낸다.

  • 시스템에 존재하는 CPU를 어느 비중만큼 나눠 쓸 것인지를 명시한다.

  • 아무런 설정을 하지 않았을 때 컨테이너가 가지는 값은 1024로, CPU 할당에서 1의 비중을 뜻한다.

부하 test

  • stress 명령어는 CPU와 메모리에 과부하를 줘서 성능을 테스트한다.
  • 이 컨테이너는 -d 옵션으로 생성되어 백그라운드에서 계속 CPU에 부하를 주므로 테스트가 끝나면 반드시 컨테이너를 삭제해야 한다.
// stress 설치
apt-get install stress

// 1개의 프로세스로 CPU에 부하를 주는 명령어
stress --cpu 1

3-2. --cpu-cpus

  • 호스트에 CPU가 여러 개 있을 때 컨테이너가 특정 CPU만 사용하도록 설정할 수 있다.

  • CPU 집중적인 작업이 필요하다면 여러 개의 CPU를 사용하도록 설정해 작업을 적절하게 분배하는 것이 좋다.

  • 병렬 처리를 위해 CPU를 많이 소모하는 워크로드를 수행해야 한다면 이 옵션을 사용하는 것이 좋다.
    👉🏻 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성을 보장할 수 있고, CPU 캐시 미스 또는 컨텍스트 스위칭과 같이 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문!


3-3. --cpu-period, --cpu-quota

  • 컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정되지만,
    run 명령어의 옵션 중 --cpu-period와 --cpu-quota로 이 주기를 변경할 수 있다.

  • 컨테이너는 [--cpu-quota 값] / [--cpu-period 값] 만큼 CPU 시간을 할당받는다.

docker run -d
--cpu-period=100000 // --cpu-period`의 기본값은 100000 ( = 100ms)
--cpu-quota=25000 // `--cpu-quota`는 `--cpu-period`에 설정된 시간 중 CPU 스케줄링에 얼마나 할당할 것인지를 설정한다.
컨테이너

3-4. --cpus

  • --cpu-period, --cpu-quota와 동일한 기능을 하지만, 좀 더 직관적으로 CPU의 개수를 직접 지정한다.

  • --cpus 옵션에 0.5를 설정하면 --cpu-period=100000 또는 --cpu-quota=50000과 동일하게 컨테이너의 CPU 를 제한할 수 있다.


4. Block I/O 제한

  • 컨테이너를 생성할 때 아무런 옵션도 설정하지 않으면
    컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않는다.

4-1. --device-write-bps, --device-read-bps

쓰기/읽기 작업의 초당 제한을 설정한다.

docker run -it
--divice-write-bps 디바이스이름:1mb // 1mb(값): `kb, mb, gb` 단위로 제한할 수 있다
컨테이너

4-2. --device-write-iops, --device--read-iops

상대적인 값을 입력한다.

docker run -it
--device-write-iops 디바이스이름:5
컨테이너
// ex) 수행 시간: 2초

docker run -it
--device-write-iops 디바이스이름:10
컨테이너
// ex) 수행 시간: 1초  👉🏻 2배 가량 차이 발생

5. 스토리지 드라이버와 컨테이너 저장 공간 제한

  • 도커 엔진은 컨테이너 내부의 저장 공간을 제한하는 기능을 보편적으로 제공하지는 않지만,
    도커의 스토리지 드라이버나 파일 시스템 등이 특정 조건을 만족하는 경우에만 이 기능을 제한적으로 사용할 수 있다.

  • 컨테이너 내부에서 개발하고 있거나, 그 외의 다른 특별한 상황이 아니라면 컨테이너 자체가 상태를 가지는(stateful)것은 바람직하지 않다.
    👉🏻 컨테이너의 저장공간을 제한하지 않는다는 선택지도 고려해 볼 수 있다.

profile
🍓e-juhee.tistory.com 👈🏻 이사중

0개의 댓글