Docker 자원 할당?

samdaso-o·2022년 3월 3일
1

Docker

목록 보기
4/4
post-thumbnail

Docker 컨테이너 자원 할당?

글을 적게 된 계기

근래에 스레드 및 세마포어라는 개념에 관심을 갖고 학습을 했다. 그러면서 자연스럽게 자원 할당이라는 개념에 관심을 가지게 되었고, 본 글쓴이가 자주 사용하면서 서버와 직결되는 docker 자원할당에 의문점을 갖게 되었다.

의문점을 갖고 학습한 내용을 기술할려고 한다.

Docker

일단 docker는 기본적으로 옵션을 따로 지정하지 않고 실행을 하면, 호스트의 자원을 제한 없이 사용할 수 있게 설정이 된다.

그저 개인 프로젝트나 테스트라면 문제가 없겠지만, 제품단계의 프로그램이라면 문제가 발생할 것이다.
그래서 컨테이너에 자원 제한을 걸 수가 있는데, 컨테이너가 실행 또는 실행중일 때 run, create, update와 같은 명령어들로 컨테이너의 자원 할당량을 설정 및 조정 가능하다.

1. 현재까지 사용한 컨테이너 자원제한 확인 방법

일단 기본적으로 자원할당을 하기전 확인부터 할 수 있어야 한다고 생각한다.
아래의 명령어로 컨테이너의 상세 정보 및 자원할당량을 확인할 수 있다.

docker inspect <container_name>

명령어를 입력하게 된다면, 컨테이너의 기본 정보(ex. id, state등등) 및 네트워크 정보까지 출력된다.

여기서 우리가 주목해야될 부분은 memory 및 cpu, block I/O 부분이다.
만약 따로 설정을 하지 않고 바로 inspect 명령어를 입력했다면, 대부분의 기본값이 0 일 것이다.
0 인 이유는 그냥 호스트 서버의 자원을 전부 사용하겠다라는 뜻이다.

2. 새로 실행할 경우 Memory 옵션 제한하기

간단하다.
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

3. cpu 제한

--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

Block I/O 제한

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

그래서 --device-write-bps, --device-read-bps, --device-write-iops, --device-read-iops옵션을 지정해 블록 입출력을 제한할 수 있다.

--device-write-bps, --device-read-bps는 각기 쓰고 읽는 작업의 초당 제한을 설정하며 kb, mb, gb 단위로 제한할 수 있다.

마무리

나는 자원할당이 필요한 이유가 적절한 자원할당으로 더 나은 성능을 클라이언트에게 제공하는 것이라고 생각을 한다.

로깅이나 서버 스펙업을 진행하는 이유도 최종적으로는 클라이언트에게 좀 더 빠르고 나은 성능을 제공하기 위함이라고 생각이 드는데, 이러한 점들을 생각해보면 자원할당은 선택적인 사항이 아니라 필수적인 사항이라는 생각이 든다.

profile
ㅎㅅㅎ

0개의 댓글