아무런 옵션을 입력하지 않으면 컨테이너는 호스트의 자원을 제한 없이 쓸 수 있게 설정된다.
호스트의 자원을 전부 점유해 다른 컨테이너들뿐 아니라 호스트 자체의 동작이 멈출 수도 있다.
docker inspect
docker run -d
--memory="1g"
컨테이너
docker run 명령어에 --memory
를 지정해 컨테이너의 메모리를 제한할 수 있다.
컨테이너 내에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료된다.
기본적으로 컨테이너의 Swap 메모리는 메모리의 2배로 설정되지만 별도로 지정할 수 있다.
입력할 수 있는 단위는 m(megabyte), g(gigabyte)이다.
제한할 수 있는 최소 메모리는 6MB이다.
Swap 메모리
실제 메모리 Ram이 가득 찼지만 더 많은 메모리가 필요할때 디스크 공간을 이용하여 부족한 메모리를 대체할 수 있는 공간
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
호스트에 CPU가 여러 개 있을 때 컨테이너가 특정 CPU만 사용하도록 설정할 수 있다.
CPU 집중적인 작업이 필요하다면 여러 개의 CPU를 사용하도록 설정해 작업을 적절하게 분배하는 것이 좋다.
병렬 처리를 위해 CPU를 많이 소모하는 워크로드를 수행해야 한다면 이 옵션을 사용하는 것이 좋다.
👉🏻 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성을 보장할 수 있고, CPU 캐시 미스 또는 컨텍스트 스위칭과 같이 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문!
컨테이너의 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 스케줄링에 얼마나 할당할 것인지를 설정한다.
컨테이너
--cpu-period
, --cpu-quota
와 동일한 기능을 하지만, 좀 더 직관적으로 CPU의 개수를 직접 지정한다.
--cpus
옵션에 0.5를 설정하면 --cpu-period=100000
또는 --cpu-quota=50000
과 동일하게 컨테이너의 CPU 를 제한할 수 있다.
쓰기/읽기 작업의 초당 제한을 설정한다.
docker run -it
--divice-write-bps 디바이스이름:1mb // 1mb(값): `kb, mb, gb` 단위로 제한할 수 있다
컨테이너
상대적인 값을 입력한다.
docker run -it
--device-write-iops 디바이스이름:5
컨테이너
// ex) 수행 시간: 2초
docker run -it
--device-write-iops 디바이스이름:10
컨테이너
// ex) 수행 시간: 1초 👉🏻 2배 가량 차이 발생
도커 엔진은 컨테이너 내부의 저장 공간을 제한하는 기능을 보편적으로 제공하지는 않지만,
도커의 스토리지 드라이버나 파일 시스템 등이 특정 조건을 만족하는 경우에만 이 기능을 제한적으로 사용할 수 있다.
컨테이너 내부에서 개발하고 있거나, 그 외의 다른 특별한 상황이 아니라면 컨테이너 자체가 상태를 가지는(stateful)것은 바람직하지 않다.
👉🏻 컨테이너의 저장공간을 제한하지 않는다는 선택지도 고려해 볼 수 있다.