<이론>
- 주제
- Docker Command를 통한 컨테이너 HW 리소스 제한
- 컨테이너 모니터링 방법
Docker Command를 통한 컨테이너 HW 리소스 제한
기본으로 컨테이너는 호스트 하드웨어 리소스(CPU, 메모리, 디스크) 의 사용 제한을 받지 않음 ⇒ 용량 제한 안걸어두면 모든 자원을 다 사용 가능함 ⇒ 특정 컨테이너가 독점 가능 ⇒ 다른 컨테이너들은 상대적으로 적은 리소스 사용 => 형평성 어긋 ⇒ 컨테이너가 필요로 하는 만큼의 리소스만 할당해야함 docker run 명령어로 동작되는 컨테이너에다가 옵션을 준다.
- 제한 가능한 HW 리소스
- CPU
- Memory
- 블럭(Disk) I/O
- Memory 리소스 제한 옵션 제한 단위 : b,k,m,g
- --memory 혹은 -m + 숫자 컨테이너가 사용할 최대 메모리 양을 지정한다.
- 제한을 넘어서면 컨테이너 자동으로 kill 됨.
- ex) docker run -d -m 512m nginx:1.14 컨테이너 내부에서 nginx 실행하는데 최대 쓸 수 있는 메모리 사이즈를 512 메가바이트로 설정하는 것
- --memory-swap + 숫자(최대 크기가 포함된 수) 컨테이너가 사용할 스왑 메모리 영역에 대한 설정. ( 실제 스왑 사이즈 = 스왑 사이즈 - 메모리 최대 사이즈 )
- 메모리 스왑 옵션 생략 시, 할당해준 최대 메모리 사이즈의 2배가 설정됨.
- ex) docker run -d -m 200m --memory-swap 300m nginx:1.14 실제 메모리 말고 디스크를 메모리처럼 쓰는 것. 총 스왑 사이즈가 합쳐서 500메가 쓸 수 있는 게 아니라 300메가에 200메가 포함되어있는거니까 실제 스왑은 100메가 ex) 메모리스왑이 200이면 실제 스왑사이즈는 200-200=0임. 실제 스왑은 할당되지 않는다.
- --memory-reservation 숫자 --memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정
- ex) docker run -d -m 1g --memory-reservation 500m nginx:1.14 nginx 컨테이너가 쓸 수 있는 메모리 사이즈가 최대 1기가바이트이고 적어도 500메가까지는 항상 쓸 수 있도록 보장받는다는 것
- --oom-kill-disable OOM Killer가 프로세스 못죽이도록 보호
- 배경 피지컬한 메모리 사이즈가 부족하게 되면 리눅스커널은 out of memory Killer를 동작시켜서 프로세스를 죽임 그럼 가상 메모리를 많이 쓰고 있는 컨테이너를 죽이겠지. 근데 이 옵션 달면 실제 피지컬 메모리가 부족해도 안죽여
- ex) docker run -d -m 200m --oom-kill-disable nginx:1.14
- --memory 혹은 -m + 숫자 컨테이너가 사용할 최대 메모리 양을 지정한다.
- CPU 리소스 제한법 cpu index는 0부터 시작됨
- --cpus 컨테이너에 할당한 CPU core수를 지정
- 컨테이너가 최대 1.5개의 cpu 파워 사용 가능 (1개 코어를 쓰면 cpu 코어 중 하나의 100%를 다 쓰는거야.)
- ex) docker run -d --cpus=".5" ubuntu:1.4 우분투 백그라운드로 실행하고 코어들 중 절반까지만 쓴다는 것.
- --cpuset-cpus 컨테이너가 사용할 수 있는 코어 개수를 설정 (컨테이너가 특정 cpu에다가 할당되도록 하기 위함)
- ex) docker run -d --cpuset-cpus 0-4 ubuntu:1.4 8개 코어일 떄 이렇게 쓰기 가능임.
- --cpu-share 혹은 -c 모든 애플리케이션 컨테이너가 기본으로 사용하는 cpu 비중을 1024 값 기반에서 상대적 비중치 설정 가능한 옵션.
- 상대적비율이므로 컨테이너 실행 개수에 따라 비율은 달라진다. ⇒ CPU 연산 작업하는(많이 필요로 하는) 애프리케이션이면 리소스를 특정 컨테이너에 더 많이 할당해야한다.
- ex) docker run -d --cpu-share 2048 ubuntu:1.4 다른 컨테이너보다(기본 값보다) 2배 많은 cpu 자원을 할당. 512로 할당하면 상대적으로 다른 컨테이너보다 리소스를 절반만 할당받게 됨
- --cpus 컨테이너에 할당한 CPU core수를 지정
- Block I/O 제한법 당연 쿼터 큰 게 i/o속도가 더 빨라짐
- -bliko-weight + 숫자 --bliko-weight-device + 디바이스명 + 숫자 : 특정 디바이스명에 대한 값 Block IO의 Quota(쿼타)를 100~1000까지 할당 가능(default 500) cpu-share처럼 모든 컨테이너가 기본값 500으로 block-io 스케줄링 받는데 특정 컨테이너에만 특정 값을 할당
- ex) docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash 다른 거에 비해 리소스를 적게 할당 받겠다는 것
- -device-read-bps + 디바이스명 + 숫자 --device-write-bps + 디바이스명 + 숫자 특정 디바이스에 대한 읽기와 쓰기 작업의 초당 바이트 제한을 kb, mb, gb 단위로 설정
- ex) docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu:latest /bin/bash docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu:latest /bin/bash dev/vda가 디바이스명임 vda에 저장할 떄는 초당 바이트를 1mb,10mb로 제한하겠딴 것
- -device-read-iops + 숫자(0이상의 정수로 표기) --device-write-iops + 숫자(0이상의 정수로 표기) 컨테이너의 read/write 속도의 초당 quota를 제한해서 I/O를 발생시킴
- 초당 데이터 전송량 = IOPS(할당해준 숫자) * 블럭크기(단위 데이터 용량) ex) 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
- -bliko-weight + 숫자 --bliko-weight-device + 디바이스명 + 숫자 : 특정 디바이스명에 대한 값 Block IO의 Quota(쿼타)를 100~1000까지 할당 가능(default 500) cpu-share처럼 모든 컨테이너가 기본값 500으로 block-io 스케줄링 받는데 특정 컨테이너에만 특정 값을 할당
컨테이너 모니터링 방법
컨테이너들이 실제로 리소스를 얼마나 쓰고 있는지를 확인할 수 있다.
- docker monitoring commands(도커 자체 모니터링 툴 명령어)
- docker stat [OPTIONS] [CONTAINER..] 실행중인 (전체/특정) 컨테이너의 런타임 통계를 확인. 내가 원하는 것들을 보여줌 (이름, cpu사용량, 메모리 사용량, 현재 메모리 백분율 할당값, 네트워크/블록io, 부모프로세스 아이디)
- docker event 도커 호스트의 실시간 event 정보를 수집해서 출력 컨테이너 이미지나 볼륨이나 네트워크 등 컨테이너와 관련된 이벤트가 발생하는 것을 보고 싶을 떄 이벤트명 넣어주면 됨. 그럼 내부적으로 만드는 메세지를 출력해줌. docker events -f container=<MAME> docker image -f container=<MAME>
- cAdvisor by 구글 docker stat랑은 다르게 웹브라우저로 GUI 형식으로 한눈에 컨테이너 사용 리소스를 확인하는 모니터링 툴.
- 쿠버네티스가 구글이 만든 것이기 떄문에 쿠버네티스의 큐블렛 안에 포함되어있어.
- 도커 자체 모니터링 툴이랑 보여주는 정보는 같은데 컨테이너 관리해줄 때 보기 좋기 사용가능
- 하드디스크에있는 리소스들을 수집을 해서 기본 포트8080로 열어서 GUI로서 웹 브라우저로 뿌려준다.
- 실행하면 현재 컨테이너가 동작되고 있는 시스템에 웹브라우저로 접속하면 확인 가능 주소/포트넘버만 입력하면 cadvisor가 동작을 하기 때문.
- 하드웨어정보 (cpu 많이 작업하는지, cpu 개수에 따른 초당 사용량, 커널/유저스페이스 중 어느쪽에서 cpu 부하 마니 일으키는지 등등 호스트정보 보여줌..) , 컨테이너모니터링툴이니까 눌르면 동작중인 컨테이너정보 나오는데 현재동작중인 컨테이너들의 리소스 점유율을 보여준다. 작업 발생시켰으면 초당 그래프들이 보여지고 아니면은 아무 그래프가 없어.
<실습>
- 컨테이너 리소스 제한
- 컨테이너 모니터링 하기
- cAdvisor 설치해서 사용하기
- 실습문제
컨테이너 리소스 제한
- stress 명령어리눅스/유닉스 등 지정된 하위 시스템에 지정된 부하를 주는 명령어
- 메모리 작업 부하 발생 작업 stress --vm 2 --vm bytes <부하를 일으킬 크기>
- ex) stress --cpu 2 2개 코어에 대해서 cpu 작업부하를 일으키는 작업을 실행
- 컨테이너에 작업 부하를 발생 시킴으로써 모니터링하기 위한 목적으로 이용
- stress 작업을 컨테이너로 만들기
- PROCESS docker 시스템에 접속 → build 폴더의 Docerfile 보면 base이미지로 데비안이고 apt-get으로 stress 설치함. 동작될 떄 명령어로 stress -c 2 입력해놓은 상태라는데 원래 되어있는 설정인건가.. → docker build -t stress 컨테이너가 빌드가 돼서 스트레스 컨테이너를 실행하면 알아서 DockerFile에 정의된대로 cpu 작업로드가 2core만큼 발생하게 됨
- 메모리 리소스 제한 실습 swap 메모리 용량 제한이 실제로 메모리 제한과 어떤 관련성이 있는지 확인한다.
- ex
- 1)
컨테이너가 쓸 수 있는 최대 메모리 : 100메가, swap-memory : 200메가 ⇒ 실제 스왑 메모리는 100 → vm-byte명령어로 초당 90 메가바이트를 vm-worker에다가 할당해서 stress로 작업 부하 발생시킴 → 실행하면 5초동안 실행됨docker run -m 100m --memory-swap 200m stress stress --vm 1 --vm-bytes 90m -t 5s
- 2)
컨테이너가 쓸 수 있는 최대 메모리 : 100메가, swap-memory : 100메가 ⇒ 실제 스왑 메모리는 0 쓸 수 있는 최대 메모리 사이즈 100을 넘어서는 150 부하를 일으키면 실행하자마자 바로 죽음( ∵피지컬 메모리 부족에 의한 outOfMemoryKiller)docker run -m 100m --memory-swap 100m stress stress --vm 1 --vm-bytes 150m -t 5s
- 3)
컨테이너가 쓸 수 있는 최대 메모리 : 100메가, swap-memory : 생략 시 2배 ⇒ 실제 스왑 메모리는 200 → vm-byte명령어로 초당 150 메가바이트를 vm-worker에다가 할당해서 stress로 작업 부하 발생시킴 → 실행하면 5초동안 실행됨docker run -m 100m stress stress --vm 1 --vm-bytes 150m -t 5s
- 2)
- 1)
- OOM_Killer를 disable 설정 : 컨테이너를 OOM-Killer로부터 보호함.
컨테이너가 쓸 수 있는 최대 메모리 : 100메가, swap-memory : 생략 시 2배 ⇒ 실제 스왑 메모리는 200 아웃오브메모리킬러는 disabledocker run -d -m 100m --name m4 --oom-kill-disable=true nginx
- 실습 : 적용 확인하는 방법
- docker inspect m4 inspect 명령어를 이용한 m4컨테이너에 대한 상세 조회
- docker ps로 확인 후 해당 컨테이너 실행중인 거 확인 → cat /sys/fs/cgroup/memory/docker/컨테이너폴더명/memory.oom_control(리소스 제한해주는 많은 파일들 중 disable트루로 설정한 게 저장된 파일임 ) 실제 리소스에 리밋을 걸어주는 건 커널의 cgroup에다가 걸어줌. memory 리소스 제한했으니까 memory
- 실습 : 적용 확인하는 방법
- ex
- cpu 리소스 제한 실습 그이후에 컨테이너 싹 다 지우고 cpu 리소스 실습하는 거 해본다.
- 관련 명령어
- htop top이랑 같은데 색깔입혀져서 나오는 거
- crm 컨테이너 모두 제거하는 명령어(강사가 명령어 정의해놓은 단축키 같음)
- -d : 백그라운드로 실행되는거라서 앞에서 1,2초 안보임
- ex) (강사가 실습한 시스템이 두개인데 하나는 lscpu 쳐보면 cpu가 총 한개짜리라고 나오고 다른 cpu는 총 2개짜리인데 2개짜리에서 실습함)
- CPU 할당
// cpu 중 1번째에다가 컨테이너를 할당하고 cpu 전체 다 씀 docker run --cpuset-cpus 1 --name c1 -d stress stress --cpu 1
// cpu의 0번쨰에서만 할당시키고 전체 다 쓰게함 docker run --cpuset-cpus 0 --name c2 -d stress stress --cpu 1
// cpu 중 0번~1번 중에 컨테이너를 그때마다 다르게 할당하겠다는 것. docker run --cpuset-cpus 0-1 --name c3 -d stress stress --cpu 1
- htop 명령어를 통해 각각의 컨테이너마다 할당한 CPU 할당 확인
- 컨테이너별로 cpu 상대적 가중치를 할당해서 실행되도록 구성한다. crm 명령어로 컨테이너 모두 제거후에 실행해야함.
// 기본값의 두배인 2048만큼 cpu를 더 쓰게됨 // => CPU 사용 비율로 따지면 cpu 100퍼 쓰는 컨테이너 docker run -c 2048 --name cload1 -d stress
// 기본값이 1024임으로 CPU 사용 비율의 절반만 쓰는 컨테이너 docker run --name cload2 -d stress
// 기본값보다 반 적은만큼 씀 - 25퍼 쓰는 컨테이너 docker run -c 512 --name cload3 -d stress
// 기본값보다 반 적은만큼 씀 - 25퍼 쓰는 컨테이너 docker run -c 512 --name cload4 -d stress
- docker ps 시, 4개 실행중인 것 확인 가능 같은 작업을 실행할 때 cload1이 cpu를 젤 많이 사용하니까 우선순위 젤 높고 →2 → 3,4(동일)
- CPU 할당
- 관련 명령어
- 블록 i/o 제한 실습
// xvda라는 디바이스에 대해 io를 전체 10만큼의 쿼터를 할당함 docker run -it --rm --device-write-iops /dev/xvda a:10 ubuntu:latest /bin/bash // 1m짜리를 10개만드니까 초당 10메가 만드는것 /# dd if=/dev/zero of=file1 bs=1m count=10 oflag=direct exit // 다음 write quota를 100으로 변경 후 같은 작업을 반복한다. docker run -it --rm --device-write-iops /dev/xvda:100 ubuntu:latest /bin/bash // 얘는 초당 254메가를 만듬 /# dd if=/dev/zero of=file1 bs=1m count=10 oflag=direct exit
- lsblk 디바이스이름이 나오는데 그 디바이스이름에 맞춰서 넣음
- dd 블록 단위로 파일을 복사하거나 파일 변환을 할 수 있는 명령어 ⇒ 쉽게 원하는 파일의 크기를 생성 가능하다.
컨테이너 모니터링 하기
docker stats 사용해서 작업 부하에 대한 상황을 보기 위해 리소스 사용 통계량 확인 docker stats cload1 해주면 cload1만 실시간으로 보여줌
cAdvisor 설치해서 사용하기
실행중인 컨테이너들의 리소스 점유율을 GUI로 확인한다.
// 컨테이너 하나를 더 실행해준다. // 500메가바이트의 메모리,스왑안넣었으니까 최대메모리의 두배 적용, 이름은 c1 docker run -it --rm --device-write-iops /dev/xvda:100 -m 500m --nme c1 -d ubuntu:latest /bin/bash /# dd if=/dev/zero of=file1 bs=1m count=10 oflag=direct
- cadvisor 설치 컨테이너 사용 리소스의 분석툴
- 리눅스에서 Quick Start 방법으로 아래의 코드를 실행VERSION=v0.36.0 # use the latest release version from https://github.com/google/cadvisor/releases sudo docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ --privileged \ --device=/dev/kmsg \ gcr.io/cadvisor/cadvisor:$VERSION
강사는 호스트 ip이써서 그걸로 접속한대
컨테이너 리소스 제한
stress 명령어
sdds
ddd
dsf
ddddddd
d
dddddd
d
dddddd
d
dddddd
d
ddddd
ddddd
dddd
dddd
dddd
dddd
dddd
실습 문제
*
1.
2.
3.
4.
실습 문제
- db라는 이름을 가지는 mysql 컨테이너를 다음의 조건으로 실행해라 그럴라면은 환경변수 추가해줘야하는데 그건 구글링을 찾아봐야돼.
- MYSQL_ROOT_PASSWORD:pass - 루트패스워드 넣어야지 mysql 실행되니까 안해도 실행되는 명령어를 넣어줘야한다.
- 물리 메모리(최대 쓸 수 있는 메모리) 200m
- 스왑 메모리 300m
- 할당 CPU core 수 : 1
- db 컨테이너 리소스 사용량을 docker stat 명령을 통해 확인해보자
* 제목3
본문
- 소제목
'DEVOPS > Docker' 카테고리의 다른 글
[따배도] 9장 - 컨테이너간 통신(네트워크) (0) | 2022.06.01 |
---|---|
[따배도] 8강 - 컨테이너 스토리지 관리 (0) | 2022.05.12 |
[따배도] 6강 - 컨테이너 사용하기 (0) | 2022.05.12 |
[따배도] 5강 - 컨테이너 Registry (0) | 2022.05.12 |
[따배도] 4강 - 도커 컨테이너 만들어보기 (0) | 2022.05.12 |