참조
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 |
---|
최근댓글