컨테이너 생성 시(run, create) 자원 할당량을 조정하도록 옵션을 입력할 수 있습니다.
아무런 옵션을 입력하지 않으면 컨테이너는 호스트의 자원을 제한없이 쓰게 됩니다.
컨테이너 자원할당이 무제한, 즉 자원할당 옵션이 설정되어있지 않으면 호스트의 자원을 전부 점유하여 다른 컨테이너 및 호스트 자체의 동작이 멈출 수 있습니다.
1. 컨테이너 메모리 제한
[root@localhost ~]# docker run -d --memory="1g" --name memory nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
69692152171a: Pull complete
30afc0b18f67: Pull complete
596b1d696923: Pull complete
febe5bd23e98: Pull complete
8283eee92e2f: Pull complete
351ad75a6cfa: Pull complete
Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
Status: Downloaded newer image for nginx:latest
1be78e2fda4d0c87ba86d4ab78fbe2fde897470fe82cb4f6bd3e0d7916a29818
--memory="1g" 옵션을 주어 컨테이너 하나를 생성했습니다.
[root@localhost ~]# docker inspect memory | grep -i 'memory'
"Name": "/memory",
"Memory": 1073741824,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 2147483648,
"MemorySwappiness": null,
Memory 가 1GB 에 해당하는 바이트값이 설정되어있는 것을 볼 수 있습니다.
(1073741824 / 1024^3(KB->MB->GB) = 1)
컨테이너 내에서 동작하는 프로세스가 할당된 메모리를 초과하면 컨테이너는 자동으로 종료됩니다.
또한 매우 적게 할당하면 컨테이너가 실행되지 않으니 적절하게 할당하는 것이 좋습니다.
[root@localhost ~]# docker run -ti --name swap500MB --memory=200m --memory-swap=500m ubuntu:18.04
[root@localhost ~]# docker inspect swap500MB |grep -i 'memory'
"Memory": 209715200,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 524288000,
"MemorySwappiness": null,
메모리는 200mb 메모리swap은 500m로 설정하여 컨테이너 생성 후 inspect 한 결과입니다.
2. 컨테이너 CPU 제한
[root@localhost ~]# docker run -ti --name cpu_share1 --cpu-shares 100 ubuntu:18.04
[root@localhost ~]# docker run -ti --name cpu_share2 --cpu-shares 500 ubuntu:18.04
--cpu-shares 옵션은 컨테이너에 가중치를 설정합니다.
즉 컨테이너에 CPU 개수를 할당하는 방식이 아닌 어느 비중만큼 나눠 쓸 것인지를 명시하는 옵션입니다.
[root@localhost /]# ps auxfw | grep stress
root 30745 0.0 0.0 116976 1016 pts/2 S+ 16:04 0:00 \_ grep --color=auto stress
root 30737 0.0 0.0 8236 500 pts/0 S+ 16:04 0:00 \_ stress --cpu 1
root 30738 97.2 0.0 8236 96 pts/0 R+ 16:04 0:03 \_ stress --cpu 1
컨테이너 각각 cpu shares 수치를 5배 차이나게 설정하여 생성하였습니다.
이 후 cpu-shares 100인 컨테이너에서 stress --cpu 1 로 코어 1개에 대한 부하테스트를 진행하였습니다.
위와 같이 97.2 거의 100%를 사용하고 있음을 볼 수 있습니다.
[root@localhost /]# ps auxfw | grep stress
root 30615 0.0 0.0 116976 1016 pts/2 S+ 16:02 0:00 \_ grep --color=auto stress
root 30549 0.0 0.0 8236 496 pts/0 S+ 16:01 0:00 \_ stress --cpu 1
root 30550 17.9 0.0 8236 92 pts/0 R+ 16:01 0:06 \_ stress --cpu 1
root 30551 0.0 0.0 8236 496 pts/0 S+ 16:01 0:00 \_ stress --cpu 1
root 30552 82.6 0.0 8236 92 pts/0 R+ 16:01 0:31 \_ stress --cpu 1
이번엔 두 컨테이너 모두 stress --cpu 1 의 명령을 한 상태에서 확인한 것 입니다.
cpu-shares의 수치가 5배가 차이나므로 cpu 사용량도 정확하진 않지만 거의 5배정보 차이나게 점유하는 것을 확인할 수 있었습니다.
이처럼 --cpu-shares에 설정된 값의 비율에 따라 컨테이너가 cpu를 사용할 수 있는 비율이 정해집니다.
[root@localhost /]# docker run -d --name cpuset --cpuset-cpus=0
[root@localhost /]# docker run -d --name cpuset --cpuset-cpus="0,3"
[root@localhost /]# docker run -d --name cpuset --cpuset-cpus="0-2"
--cpuset-cpus 옵션은 특정 cpu만 사용하도록 설정하는 옵션입니다.
위에서부터 차례대로 1번째 cpu만 사용, 1,4번째 cpu만 사용, 1~3번째 cpu만 사용 한다는 옵션입니다.
[root@localhost /]# docker run -d --name quota_1_4 --cpu-period=100000 --cpu-quota=25000 ubuntu:18.04
[root@localhost /]# docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=100000 ubuntu:18.04
--cpu-quota는 --cpu-period에 설정된 시간 중 cpu 스케줄링에 얼마나 할당할 것인지를 설정합니다.
위에서 period값 100000 중에 quota가 25000 설정되어있으므로 cpu 주기가 1/4로 줄었으므로 일반적인 컨테이너보다 cpu 성능이 1/4 감소합니다.
이것과 동일한 옵션인 --cpus 가 있습니다.
--cpus=0.25 와 --cpu-period=100000 --cpu-quota=25000 은 동일한 의미가 됩니다.
--cpus=0.25의 뜻은 직관적으로 cpu의 개수를 직접 지정한다는 것 입니다.
여기서도 stress 로 부하테스트를 하면 quota가 25000으로 설정된 컨테이너가 1/4만큼 cpu를 적게 사용하는 것을 볼 수 있습니다.
3. Block I/O 제한
컨테이너 생성 시 아무런 옵션도 없으면 컨테이너 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않습니다.
[root@localhost /]# docker run -ti --device-write-bps /dev/xvda:1mb ubuntu:18.04
root@a58113fa0a92:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 10.0035 s, 1.0 MB/s
초당 쓰기 작업의 최대치를 1MB로 제한한 후 10MB파일을 direct I/O를 통해 쓰기 작업을 수행했습니다.
테스트결과 처럼 속도가 초당 1.0MB 로 제한되는 것을 확인할 수 있습니다.
--device-write-iops / --device-read-iops 도 --cpu-shares 처럼 값을 입력하면 상대적인 비율로 수치가 계산됩니다.
--device-write-iops /dev/xvda:5
--device-write-iops /dev/xvda:10
위 처럼 옵션을 주면 각각 쓰기속도가 2배 차이가 나는 것을 확인할 수 있습니다.
'docker' 카테고리의 다른 글
도커 컨테이너 다루기(8) - 도커파일(Dockerfile)[1] (1) | 2021.06.01 |
---|---|
도커 컨테이너 다루기(7) - 도커 이미지(Image) (0) | 2021.05.31 |
도커 컨테이너 다루기(5) - 컨테이너 로깅 (0) | 2021.05.28 |
도커 컨테이너 다루기(4) - 도커 네트워크 (0) | 2021.05.26 |
도커 컨테이너 다루기(3) - 도커 볼륨 (0) | 2021.05.25 |