[Docker] 4. Container resource

Jae Gyeong Lee·2024년 2월 7일

1. 실행하려 하는 컨테이너의 하드웨어 리소스 제한

  • 특별히 용량 제한을 걸어주지 않으면, Docker host pc 하드웨어 리소스의 모든 사이즈를 컨테이너가 사용할 수 있게 됨

  • Docker host pc에 N개의 컨테이너가 작동중이라면, 컨테이너1이 리소스를 많이 사용할 시 나머지(컨테이너2, 컨테이너3, ... 컨테이너N)들은 리소스를 상대적으로 적게 사용하게 됨

    => 특정 컨테이너가 필요로 하는 만큼만 리소스를 할당하는 것이 좋음

  • Docker command를 통해 제한할 수 있는 리소스: CPU, Meomry, Disk I/O

$docker run -- 할때 제한을 걸어줄 수 있음.

1.1. Memory 리소스 제한

  • 제한 단위: b(바이트), k(키로바이트), m(메가바이트), g(기가바이트)

1.1.1. --memory, -m : 컨테이너가 사용할 최대 메모리 양 지정.

1.1.2. --memory-reservation: --memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정.

1.1.3. --memoryswap : 컨테이너가 사용할 스왑 메모리 영역에 대한 설정(Disk를 Memory처럼 쓰는 것).

  • 명시된 스왑 사이즈는 '메모리+스왑', 생략 시 메모리의 2배가 설정됨.

1.1.4. --oom-kill-disable : OOM Killer가 프로세스 kill하지 못하도록 보호.

  • 리눅스 커널은 메모리 사이즈가 부족하게되면, oom killer를 동작시켜 프로세스들을 kill한다. --oom-kill-disable은 이를 방지하는 명령어

사용 예,

$docker run -d -m 512m nginx:1.14
→ {nginx:1.14} 컨테이너를 가동하는데, 이 컨테이너는 메모리 사이즈를 최대 512MB까지 사용할 수 있다.

$docker run -d -m 1g --memory-reservation 500m nginx:1.14
→ {nginx:1.14} 컨테이너를 가동하는데, 이 컨테이너는 메모리 사이즈를 최소 500MB에서 최대 1GM까지 사용할 수 있다.
	→ 500MB는 항상 사용할 수 있게 '보장'하는 옵션

$docker run -d -m 200m --memory-swap 300m nginx:1.14
→ {nginx:1.14} 컨테이너를 가동하는데, 이 컨테이너는 메모리 사이즈를 200MB까지 사용할 수 있고, 스왑 사이즈도 300MB 사용할 수 있다.
	→ 스왑 사이즈 300MB = (메모리 사이즈(2OOMB) + 스왑 사이즈(100MB))

$docker run -d -m 200m --oom-kill-disable nginx:1.14
→ {nginx:1.14} 컨테이너를 가동하는데, 이 컨테이너는 메모리 사이즈를 200MB까지 사용할 수 있고, 메모리가 부족해도 이 컨테이너를 OOM Kill하지 말아라.

1.2. CPU 리소스 제한

1.2.1. --cpu : 컨테이너에 할당할 CPU core 수 지정

  • --cpus="1,5"컨테이너가 최대 1.5개의 CPU 파워 사용 가능

1.2.2. --cpuset-cpus : 컨테이너가 사용할 수 있는 CPU나 코어를 지정. cpu index는 0부터 카운트.

  • --upset-cpus=0-4, cpu 0번, 1번, 2번, 3번, 4번

1.2.3. --cpu-share : 상대적 가중치로 CPU 자원을 할당. CPU 비중의 기본 값은 1024.

  • --cpu-share2048은 기본 값보다 두 배 많은 CPU 자원을 할당하겠다는 것.

사용 예,

$docker run -d --cpus =".5" ubuntu:1.14
→ {ubuntu:1.14} 컨테이너를 가동하는데, n개의 CPU core 중 1개 core의 절반(0.5)만 사용.

$docker run -d --cpu-share 2048 ubuntu:1.14
→ {ubuntu:1.14} 컨테이너를 가동하는데, 다른 컨테이너에 비해 2배 많은 리소스를 할당.

$docker run -d --cpuset-cpus 0-3 ubuntu:1.14
→ {ubuntu:1.14} 컨테이너를 가동하는데, 이 컨테이너는 '0번, 1번, 2번, 3번' core에서 동작해라.
→ cpu가 총 0번부터 4번까지 있다면, 컨테이너1에 0-1, 컨테이너2에 2-3 할당하여 분산.

* $lscpu #CPU가 몇개인지 볼 수 있음 (CPU(s))

1.3. Block I/O 제한

1.3.1. --blkio-weight, --blkio-weight-device : Blcok IO의 Quata를 설정, 100 ~ 1000까지 중 할당 가능(default: 500)

  • 상대적 가중치로 적용(--cpu-share와 유사)

1.3.2. --device-read-bps, --device-write-bps : 초당 얼마 만큼의 byte로 read/write 작업을 할 수 있는지 제한.

  • 제한 단위는 kb, mb, gb로 설정
  • bps = byte for sec

1.3.3. --device-read-iops, --device-write-iops : 컨테이너의 read/write 속도의 쿼터를 설정. 초당 quata를 설정해 I/O를 발생시킴.

  • 0 이상의 정수로 표기.
  • 초당 데이터 전송량 = IOPS * 블럭크기(단위 데이터 용량).

사용 예,

$docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash
→ default가 500인데 100을 설정한다는 건 리소스를 적게 할당한다는 것

$docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu:latest /bin/bash
→ vda 저장해 줄 때 작업 속도를 1mb로 제한

$docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu:latest /bin/bash
→ → vda 저장해 줄 때 작업 속도를 10mb로 제한

$docker run -it --rm --device-write-iops /dev/vda:10 ubuntu:latest /bin/bash
$docker run -it --rm --device-write-iops /dev/vda:100 ubuntu:latest /bin/bash

2. 컨테이너가 사용하는 리소스 확인 방법

  • docker stats: 가동중인 컨테이너의 CPU, Memory, I/O 리소스를 실시간으로 보여줌
$docker stats [옵션] [컨테이너] # 해당 컨테이너의 리소스 사용량
$docker stats #현재 가동중인 컨테이너들의 리소스 사용량

참고:

profile
안녕하세요 반갑습니다. 공부한 내용들을 기록하고 있습니다.

0개의 댓글