참조
https://junstar92.tistory.com/165 [별준 코딩]
https://hoony-gunputer.tistory.com/entry/docker-컨테이너-자원-할당-제한 [후니의 컴퓨터]




Docker 컨테이너를 run, create 명령어로 생성할 때 자원 할당량을 조정하도록 옵션을 입력할 수 있다. 입력하지 않을 경우에는 호스트의 자원을 제한 없이 사용할 수 있다.

모든 자원을 사용할 경우 호스트 및 타 컨테이너에 영향을 줄 수 있으므로 설정하는 방법을 알아본다.

컨테이너의 자원 확인 방법


# 샘플 nginx conatiner를 구동한다
docker run --name sample-nginx -d -p 80:80 nginx

# 구동 확인
root@DESKTOP-A6PP2HU:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
b827d84e42c4   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   sample-nginx


# docker inspect [docker_id]
docker inspect b827d84e42c4 | grep -A10 Cpu
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
--
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",

컨테이너 메모리 제한

docker run 명령어에 --memory 옵션을 사용해 메모리를 제한 할 수 있다.

단위는 m(megabyte), g(gigabyte) 이며 제한할 수 있는 최소 단위는 4MB 이다.


# 컨테이너 구동
root@DESKTOP-A6PP2HU:~# docker run --memory="1g" --name nginx_mem_1g -d -p 80:80 nginx
a0446ad848fb23af8a7990bbbfb55a1439ee1b8c1445b2793576bcc6f8fb2f4b

# 컨테이너 확인
root@DESKTOP-A6PP2HU:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
a0446ad848fb   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp   nginx_mem_1g

# 리소스 설정 확인

root@DESKTOP-A6PP2HU:~# docker inspect a0446ad848fb | grep Memory
            "Memory": 1073741824, # 1g
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 2147483648,
            "MemorySwappiness": null,

컨테이너의 메모리 사용량이 할당된 메모리를 초과한다면 컨테이너는 자동으로 종료되므로 메모리를 적절히 할당하는 것이 좋다.

SWAP 메모리 설정도 가능하며 일반적으로는 memory의 2배 정도가 기본 설정된다. 옵션은 --memory-swap 이다.

컨테이너 CPU 제한

1. --cpu-shares(-c) 옵션

컨테이너에 가중치를 설정하여 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지를 나타낸다.
CPU의 할당이 아닌 시스템에 존재하는 CPU를 어느 비중만큼 나누어 사용할 것인지 명시하는 옵션이다.

docker run --cpu-shares 1024 --name nginx_limit_cpu -d -p 80:80 nginx

옵션이 상대적인 값을 의미하기 때문에 아무 설정을 하지 않았을 경우 컨테이너가 가지는 기본값음 1024로 CPU 할당에서 1의 비중을 의미한다.

테스트 방법 참고 : https://junstar92.tistory.com/165

2. --cpuset-cpus

호스트에 여러 개의 CPU가 있을때, 특정 CPU만 사용하도록 지정하기 위한 옵션.
CPU 집중적인 작업이 필요하다면, 여러 개의 CPU를 사용하도록 설정해 작업을 적절하게 분배하는 것이 필요하다.

# 3번째 cpu만 사용하도록 설정
docker run --cpuset-cpus=2 --name nginx_limit_cpu -d -p 80:80 nginx

#--cpuset-cpus="0, 3"은 1,4번째 CPU를 사용하고, --cpuset-cpus="0-2"는 1,2,3번째 CPU를 사용한다는 의미입니다.

테스트 방법 참고 : https://junstar92.tistory.com/165

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

컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정되지만
--cpu-period, --cpu-quota 는 이 주기를 변경 가능하다.

CFS : 리눅스 프로세스 스케쥴러, CPU의 리소스 할당을 관리한다.

docker run --cpu-period=100000 --cpu-quota=25000 --name nginx_cpu -d -p 80:80 nginx

--cpu-period의 기본값은 100000이며, 이는 100ms를 의미한다.

--cpu-quota는 --cpu-period에 설정된 시간 중 CPU 스케쥴링에 얼마나 할당할 것인지를 설정한다.
위 컨테이너에서 100000 중 25000만큼을 할당해 CPU 주기가 1/4로 감소하게 되고, 이는 일반적인 컨테이너보다 CPU 성능이 1/4정도로 감소하게 됩니다.
즉, 컨테이너는 [-cpu-quota 값] / [--cpu-period 값]만큼 CPU 시간을 할당 받는다.

4. --cpus

--cpus 옵션은 --cpu-period, --cpu-quota와 동일한 기능을 갖지만, 조금 더 직관적으로 cpu 개수를 직접 지정한다는 차이가 있다

--cpu=0.5, --cpu-period=1000000, --cpu-quota=500000 과 동일 효과의 제한이 된다.

docker run --cpus=0.5 --name nginx_cpu -d -p 80:80 nginx

테스트 방법 참고 : https://junstar92.tistory.com/165

Block I/O 제한

옵션 설정이 없을 경우 파일을 읽고 쓰는 대역폭에도 제한이 설정되지 않는다.
하나의 컨테이너가 입출력을 독점해 사용하는것을 막기 위해서는 블록 입출력을 제한하는 옵션을 설정할 수 있다.

--device-write-bps, --device-read-bps, --device-write-iops, --device-read-iops

단, Direct I/O 에서만 입출력이 제한되며 Buffered I/O는 제한되지 않는다.

Direct I/O - 운영체제를 거치지 않고 직접 I/O 실행
Buffered I/O - 버퍼에 저장된 데이터의 I/O를 실행

--device-write-bps, --device-read-bps

쓰고 읽는 초당 제한을 설정하며, kb/mb/gb 단위로 제한 가능하다

docker run --device-write-bps [device-name]:5 --device-read-bps [device-name]:5 --name nginx_io_bps -d -p 80:80 nginx

--device-write-iops, --device-read-iops

cpu-shares 처럼 상대적인 값을 입력한다.

# read가 2배 빠르게 설정한다는 의미
docker run --device-write-iops [device-name]:5 --device-read-iops [device-name]:10 --name nginx_io_iops -d -p 80:80 nginx

'Docker' 카테고리의 다른 글

Docker의 프로세스 격리 기술  (0) 2022.04.14
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기