[DOCKER]컨테이너 리소스 모니터링과 자원 할당 관리-11

컨테이너 리소스 모니터링을 위한 cadvisor

컨테이너들을 모니터링하는 도구인 cadvisor를 설치하고 metric(지표)가 의미하는 바를 알아 봅시다.

이전장에서 이미 설치를 진행해서 올라가 있네요. 혹시나 설치가 안되어 있을수도 있으니 아래에 설치하는 명령어를 적어 놓을게요.
arm64버전의 문제인지 CPU 항목에서 usage per core 활성화가 안되서 확인이 안되는 문제가 있습니다.

docker run --restart=always --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro  --publish=9559:8080 --detach=true  --name=cadvisor --privileged  --device=/dev/kmsg  gcr.io/cadvisor/cadvisor-arm64:v0.47.2

docker run -d --name=mywebserver -p 8001:80 nginx:1.25.0-alpine
docker ps -a
curl localhost:8001

컨테이너를 모니터링 하는 도구인 cAdvisor가 잘 작동하나 테스트를을 위해서 nginx컨테이느를 올리고 8001을 여러번 호출해서 metric이 변동이 있는지 확인해 봤습니다.


 

cadvisor와 연동 가능한 Observability tool, Prometheus+Grafana

cadvisor정보와 연동이 가능한 툴로 prometheus(db), grafana(모니터링) 설치 하는 방법을 정리해 보겠습니다.
아직 강의를 진행 하진 않았는데 여기서는 docker-compose를 통해서 여러 컨테이너들을 한번에 올려서 진행하고 있습니다.
소스를 보면 알겠지만 cadvior도 같이 설치하기에 기존에 설치한 컨테이너는 삭제 하고 진행하겠습니다.

# cadvisor 삭제
docker stop cadvisor
cexrm

cd ~/fastcampus/ch07/docker-promethus

#tree install
sudo apt install -y tree
tree

위의 파일들은 https://github.com/hylee-kevin/fastcampus에 있습니다. 다운 로드 받으신후 진행하시면 됩니다.
docker-compose.yaml은 버전문제로 cadvisor 부분이 수정이 되어야 합니다.

version: "3"

networks:
  dockermon:
    driver: bridge

services:
  prometheus:
    container_name: prometheus
    image: prom/prometheus:latest
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    networks:
      - dockermon
    depends_on:
      - cadvisor
      - node-exporter

  node-exporter:
    container_name: node-exporter
    image: prom/node-exporter
    ports:
      - "9100:9100"
    networks:
      - dockermon

  cadvisor:
    image: gcr.io/cadvisor/cadvisor-arm64:v0.47.2
    container_name: cadvisor
    ports:
      - 9559:8080
    restart: always
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    networks:
      - dockermon

  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml
    environment:
     #- GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_SECURITY_ADMIN_PASSWORD=pass123#
    networks:
      - dockermon
    depends_on:
      - prometheus

 

 

 

docker compose version
docker compose up -d

 

docker compose가 올라가면서 아래의 4가지 컨테이너가 올라가는 것을 알수 있습니다.
Node Exporter는 시스템정보를 수집해서 프로메테우스에 전달하는 역할을 합니다.
프로메테우스는 디비입니다. 그라파나는 모니터링 도구 이며 로그등을 확인할수있습니다.

 

컨테이너 리소스 측정도구, htop

sudo apt -y install htop
htop

 

[실습] CPU 자원 소비 제어

컨테이너들은 별다른 설정이 없으면 제한없이 리소스를 소비하기 때문에 cpu, memory등을 과도하게 사용하여 다른 컨테이너들에 성능에 영향을 줄수 있다. 여기서는 그러한 상황을 방지할수 있는 방법 들을 연습해보자.

[실습1] CPU time scheduling, –cpu-shares

이번 실습은 실습에서 사용하는 leecloudo/stress:1.0 이미지가 arm64를 지원하지 않아서 다른 이미지를 사용하였습니다. junseongday.stress:1.0을 이용해서 진행하겠습니다.

docker run -d --name cpu_1024 --cpu-shares 1024 junseongday/stress:1.0 --cpu4
docker run -d --name cpu_512 --cpu-shares 512 junseongday/stress:1.0 --cpu4

ps -auxf | grep stress

–cpu-share 숫자: 숫자는 가중치를 나타냅니다. 기본이 1024이고 512, 2048 등으로 변경을 주어서 할당량을 조절가능합니다.
여기서는 cpu_1024가 더 많은 가중치를 가지므로 더 높은 cpu사용량을 가지게 됩니다

 

 

 

[실습2] CPU지정, –cpuset-cpus

docker run -d --name cpuset_1 --cpuset-cpus=2 junseongday/stress:1.0 stress --cpu 1

특정 코어만 지정해서 테스트를 할수 있습니다.
–cpu-cpus: 사용할 cpu코어를 적어주는 곳입니다. 0,1,2,3에서 선택하면 됩니다.
–cpu: 사용할 코어의 수
여기서는 2번 인덱스의 코어 1나만 스트레스 테스트를 진행한다는 의미입니다.

 

 

docker run -d --name cpuset_2 --cpuset-cpus=0,3 junseongday/stress:1.0 stress --cpu 2

0, 3번 인덱스의 코어 두개를 사용해서 스트레스 진행, 만약 –cpu 1로 한다면 두개중의 하나를 선택해서 진행합니다.

 

[실습3] CPU 사용 비율 지정, –cpus

–cpus: cpu 사용률을 퍼센트로 지정할수 있다.

docker update --cpus=0.2 cpuset_1

0.2로 20%의 사용률을 가지는 것을 알수 있다.

 

[실습] 메모리 자원 소비 제어

 

[실습1] memory hard limit, –memory(-m)

docker run -d --memory=1g --name=nginx_mem_1g nginx
docker inspect nginx_mem_1g | grep -i memory

–mermory=1g 옵션으로 nginx를 올리고 inspect 어떻게 만들어졌는지 확인해보자.
메모리는 1g, 메모리스왑은 별다른 설정을 하지 않으면 메모리의 두배로 나온다. 실제 스왑영역은 MemoryWap – Memory이다. 즉 1g이다.

 

cadvisor에서 확인해 보았다.

 

[실습2] swap memory limit, –memory-swap

docker run -m=200m --memory-swap=300m -itd --name=mem-test ubuntu:14.04
docker inspect mem-test | grep -i memory

메모리 200m, 스왑 100m 설정하고 확인해보자

 

[실습3] docker update

docker run -itd --memory=6m --name=mydb -e MYSQL_ROOT_PASSWORD=pass123# arm64v8/mysql:8.1.0
docker ps -a | grep mydb
docker logs mydb

메모리를 6m로 지정하니 오류가 나면서 컨테이너가 안올라간다. 최소메모리로 200m정도가 필요하다고 한다. docker logs로 로그를 확인해보자.

 

docker update --memory=300m --memory-swap=600m mydb 
docker ps -a | grep mydb
docker start mydb
docker ps -a | grep mydb

메모리를 300 메가로 올리고 스왑도 300메가를 주었다. 다시 올려보면 잘 올라가는 것을 확인 할수 있다.

 

[실습4] memory 과부하 테스트

docker run -it --rm --memory=200m --memory-swap=200m junseongday/stress:1.0 --vm 1 --vm-bytes 250m -t 10s
docker run -it --rm --memory=200m --memory-swap=200m junseongday/stress:1.0 --vm 1 --vm-bytes 150m -t 10s
docker run -it --rm --memory=200m --memory-swap=200m junseongday/stress:1.0 --vm 1 --vm-bytes 200m -t 10s
docker run -it --rm --memory=200m junseongday/stress:1.0 --vm 1 --vm-bytes 150m -t 10s
docker run -it --rm --memory=200m junseongday/stress:1.0 --vm 1 --vm-bytes 250m -t 10s
docker run -it --rm --memory=200m junseongday/stress:1.0 --vm 1 --vm-bytes 300m -t 10s
docker run -it --rm --memory=200m junseongday/stress:1.0 --vm 1 --vm-bytes 400m -t 10s

–vm 1: 1나의 가상메모리 스레드 사용
–vm-bytes: 부하

가상메모리 + 스왑 > 부하 일때는 정상, 같거나 작으면 에러가 나는 것을 알수 있다.

 

[실습] Disk 자원 소비 제어

Disk I/O 측정 도구, iostat => ~$ iostat 2 100

sudo apt install sysstat
iostat 2 1000

Disk I/O측정 도구를 설치하고 실행해보자.

[실습1] MBPS(Mega Byte per second), 초당 처리량

docker run -it --rm ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct
exit

제한을 걸지 않았을경우 638MB/s가 나왔습니다.

 

docker run -it --rm --device-write-bps /dev/sdb:1mb ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct
exit

–device-write-bps /dev/sdb:1mb 초당 처리량을 1mb로 제한하였다.
실제 처리 속도도 1.0MB/s로 제한된 것을 확인 할수 있다.

docker run -it --rm --device-write-bps /dev/sdb:10mb ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct 
exit

10mb로 제한테스트

 

[실습]IOPS(IO per second), 초당 I/O 회수

docker run -it --rm ubuntu:14.04 bash
dd if=/dev/zero of=blkio.out bs=1M count=10 oflag=direct

docker run -it --rm --device-write-iops /dev/sdb:10 ubuntu:14.04 bash
dd if=/dev/zero of=blkio.out bs=1M count=10 oflag=direct

docker run -it --rm --device-write-iops /dev/sdb:1 ubuntu:14.04 bash
dd if=/dev/zero of=blkio.out bs=1M count=10 oflag=direct

제한 하지 않았을 경우 849MB/s, 10개 5.8MB/s, 1개 806 KB/s의 속도가 나왔다

 

이번 글에서는 도커 컨테이너의 성능을 제어하고 테스트 하는 법을 알아보았습니다. 상황에 맞게 적절하게 성능을 제한해 두는 것이 좋겠습니다.
그럼 다음 글에서 다시 봐요.

Leave A Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다