근래에 스레드 및 세마포어라는 개념에 관심을 갖고 학습을 했다. 그러면서 자연스럽게 자원 할당이라는 개념에 관심을 가지게 되었고, 본 글쓴이가 자주 사용하면서 서버와 직결되는 docker 자원할당에 의문점을 갖게 되었다.
의문점을 갖고 학습한 내용을 기술할려고 한다.
일단 docker는 기본적으로 옵션을 따로 지정하지 않고 실행을 하면, 호스트의 자원을 제한 없이 사용할 수 있게 설정이 된다.
그저 개인 프로젝트나 테스트라면 문제가 없겠지만, 제품단계의 프로그램이라면 문제가 발생할 것이다.
그래서 컨테이너에 자원 제한을 걸 수가 있는데, 컨테이너가 실행 또는 실행중일 때 run, create, update와 같은 명령어들로 컨테이너의 자원 할당량을 설정 및 조정 가능하다.
일단 기본적으로 자원할당을 하기전 확인부터 할 수 있어야 한다고 생각한다.
아래의 명령어로 컨테이너의 상세 정보 및 자원할당량을 확인할 수 있다.
docker inspect <container_name>
명령어를 입력하게 된다면, 컨테이너의 기본 정보(ex. id, state등등) 및 네트워크 정보까지 출력된다.
여기서 우리가 주목해야될 부분은 memory 및 cpu, block I/O 부분이다.
만약 따로 설정을 하지 않고 바로 inspect 명령어를 입력했다면, 대부분의 기본값이 0 일 것이다.
0 인 이유는 그냥 호스트 서버의 자원을 전부 사용하겠다라는 뜻이다.
간단하다.
docker run 명령어에 --memory 옵션만 붙히면 된다.
docker run -d \
--memory="1g" \
--name memory_1g \
test_image:1.0.0
참고로 최소 메모리 할당량은 4MB이며, m은 MB를, g는 GB를 뜻한다. 컨테이너에 할당된 메모리가 초과되면 컨테이너가 종료되니 메모리를 적절히 할당해야한다.
또한 swap도 적용가능하다. (메모리가 부족할 때 하드디스크의 일부를 활용해 작업을 계속 진행하게 도와주는 영역)
docker run -d \
--name memory_1g \
--memory="1g" \
--memory-swap=500m \
test_image:1.0.0
--cpu-shares 옵션
위의 옵션은 cpu 코어의 갯수를 할당해서 정하는 것이 아니라, 컨테이너에 가중치를 정해 해당 컨테이너가 호스트의 존재하는 cpu를 어느 정도의 비중까지 나눠 쓸것인지 명시할 수 있다.
docker run -d \
--name cpu_share1 \
--cpu-shares 1024 \
test_image:1.0.0
별다른 설정을 하지 않았다면 1024는 할당량 1을 뜻한다.
--cpuset-cpu 옵션
컨테이너가 특정 cpu만 사용할 수 있게 설정하는 옵션이다.
docker run -d \
--name cpuset1 \
--cpuset-cpus=2 \
test_image:1.0.0
--cpus
cpu의 갯수를 직접 지정할 수 있는 명령어이다.
docker run -d \
--name cpus1 \
--cpus=0.5 \
test_image:1.0.0
이것 또한 컨테이너를 생성할때 옵션을 설정하지 않으면 내부에서 파일을 읽고 쓰는 대역폭 제한이 설정되지 않는다.
그래서 --device-write-bps, --device-read-bps, --device-write-iops, --device-read-iops옵션을 지정해 블록 입출력을 제한할 수 있다.
--device-write-bps, --device-read-bps는 각기 쓰고 읽는 작업의 초당 제한을 설정하며 kb, mb, gb 단위로 제한할 수 있다.
나는 자원할당이 필요한 이유가 적절한 자원할당으로 더 나은 성능을 클라이언트에게 제공하는 것이라고 생각을 한다.
로깅이나 서버 스펙업을 진행하는 이유도 최종적으로는 클라이언트에게 좀 더 빠르고 나은 성능을 제공하기 위함이라고 생각이 드는데, 이러한 점들을 생각해보면 자원할당은 선택적인 사항이 아니라 필수적인 사항이라는 생각이 든다.