반응형
말랑Cow
IT
말랑Cow
전체 방문자
오늘
어제
  • 분류 전체보기 (165)
    • Linux (33)
    • Windows (6)
    • Network (7)
    • Hardware (10)
    • Zabbix (13)
    • python (9)
    • script (0)
    • docker (16)
    • NAS (1)
    • DB (3)
    • php (33)
    • jQuery (1)
    • 정보보안기사 (0)
    • Ajax (1)
    • Javascript (21)
    • DELL (0)
    • HPE (0)
    • Secui (0)
    • AWS (2)
    • Elastic (0)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 모니터링
  • php 클래스
  • 파이썬
  • JavaScript
  • php 객체
  • jQuery
  • bash
  • 도커
  • Python
  • 서버
  • 자빅스
  • Linux
  • docker
  • 네트워크
  • CentOS
  • Shell
  • 자바스크립트
  • 리눅스
  • ZABBIX
  • php
hELLO · Designed By 정상우.
말랑Cow

IT

docker

도커 컨테이너 다루기(6) - 컨테이너 자원 할당 제한

2021. 5. 29. 00:00
반응형

컨테이너 생성 시(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
    'docker' 카테고리의 다른 글
    • 도커 컨테이너 다루기(8) - 도커파일(Dockerfile)[1]
    • 도커 컨테이너 다루기(7) - 도커 이미지(Image)
    • 도커 컨테이너 다루기(5) - 컨테이너 로깅
    • 도커 컨테이너 다루기(4) - 도커 네트워크
    말랑Cow
    말랑Cow

    티스토리툴바