본문 바로가기

따배도 스터디

7-2 컨테이너 리소스를 관리해야지 -실습편

728x90

1.컨테이너 리소스 제한

 

stress container 생성

 

CPU 부하테스트: 2개 CPU core를 100% 사용하도록 부하 발생: stree --cpu 2

메모리 부하테스트: 프로세스 수 2개와 사용할 메모리만큼 부하 발생:stress --vm 2 --vm-bytes <사용할 크기>

 

vi Dockerfile 생성 후 

FROM debian
MAINTAINER Seunghan Lee <seunghan96@naver.com>
RUN apt-get update; apt-get install stress -y
CMD ["/bin/sh", "-c", "stress -c 2"]

해당코드를 삽입후 docker build . -t stress 명령어를 입력한다.image 파일이 생김

REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
stress                    latest    6b2f2332f8e2   56 seconds ago   143MB
mysql                     latest    8189e588b0e8   3 days ago       564MB
kimminwoo1234/webserver   v1        09b848442d5b   10 days ago      204MB
webserver                 v1        09b848442d5b   10 days ago      204MB
hellojs                   latest    50dd87d32f95   10 days ago      918MB
httpd                     latest    dc1a95e13784   2 weeks ago      145MB
localhost:5000/httpd      latest    dc1a95e13784   2 weeks ago      145MB
registry                  2         8db46f9d7550   3 weeks ago      24.2MB
nginx                     latest    080ed0ed8312   3 weeks ago      142MB

docker run -m 100m --memory-swap 200m stress:latest stress --vm 1 --vm-bytes 90m -t 5s

5초동안 90메가바이트의 부하를 일으킴

 

결과:

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [1] successful run completed in 5s

 

docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s

 

결과:

ubuntu@ip-172-31-45-232:~$ docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (415) <-- worker 7 got signal 9
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 0s

스왑 메모리 생략할 경우?
default는 “메모리의 2배” ( 100x2 = 200 MB )
따라서 정상 작동한다

 

OOM-killer

 

docker run -d -m 100M --name m4 --oom-kill-disable=true nginx리눅스는 메모리가 부족하게 되면 OOM killer가 동작되어 프로세스가 작동되지만 이를 꺼준다

 

이거 왜 오류뜨는걸까 ... 스터디 하시는분들중에 aws ec2로 환경 사용하시는 분들에게 여쭤봐야겠다.

ubuntu@ip-172-31-45-232:~$ docker run -d -m 100M --name m4 --oom-kill-disable=true nginx
WARNING: Your kernel does not support OomKillDisable. OomKillDisable discarded.

메모리제한 

 

 

docker run --cpuset-cpus 1 --name c1 -d stress:latest stress --cpu 1

 

1번 cpu를 작동시키라는 의미

2.컨테이너 모니터링하기

 

# apt-get install htop
htop
  • (line 2) htop을 사용하여 확인

docker run -c 2048 --name cload1 -d stress:latest
docker run --name cload2 -d stress:latest
docker run -c 512 --name cload3 -d stress:latest

순서대로 2배/1배/0.5배 만큼 cpu 사용

 

docker stats cload1 cload1 에 대한 리소스 사용통계량을 실시간으로 확인가능(

STATISTICS통계 약자)

c99ce483b732   cload1    0.44%     792KiB / 965.8MiB   0.08%     726B / 0B   8.19kB / 0B   4
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS
c99ce483b732   cload1    0.44%     792KiB / 965.8MiB   0.08%     726B / 0B   8.19kB / 0B   4
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS
c99ce483b732   cload1    99.92%    792KiB / 965.8MiB   0.08%     726B / 0B   8.19kB / 0B   4
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS

Block I/O 제한

lsblk

 

ubuntu@ip-172-31-45-232:~$ lsblk
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0      7:0    0  24.4M  1 loop /snap/amazon-ssm-agent/6312
loop1      7:1    0  55.6M  1 loop /snap/core18/2714
loop2      7:2    0  55.6M  1 loop /snap/core18/2721
loop3      7:3    0  63.3M  1 loop /snap/core20/1852
loop4      7:4    0 111.9M  1 loop /snap/lxd/24322
loop5      7:5    0  49.8M  1 loop /snap/snapd/18596
xvda     202:0    0    30G  0 disk
├─xvda1  202:1    0  29.9G  0 part /
├─xvda14 202:14   0     4M  0 part
└─xvda15 202:15   0   106M  0 part /boot/efi

 

ubuntu@ip-172-31-45-232:~$ docker run -it --rm --device-write-iops /dev/xvda:10 ubuntu:latest /bin/bash
root@00b9e2cd6c42:/# dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 7.90572 s, 1.3 MB/s

 

 

docker run -it 를 하게되면 컨테이너에 접속하여 사용할수 있게 됩니다.

/dev/xvda:10 은 IOPS(input output operations per second)한도를 10으로 설정합니다.

 

dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct 는 무슨의미일까?

 

file1에 1M짜리 10개를 만들어본다

f=/dev/zero는 입력 파일을 "/dev/zero"로 설정합니다. 이 파일은 무한한 0 바이트 시퀀스를 출력하는 가상 파일입니다.

dd는 데이터를 복사하고 변환하는 유틸리티입니다.

count=10은 10개의 블록을 생성하도록 지정합니다. 따라서 "file1"에는 10MB의 0으로 채워진 데이터가 생성됩니다

 

 

 

docker run -it --rm --device-write-iops /dev/sda:100 ubuntu:latest /bin/bash

dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct

결과: 당연한 결과겠지만 IO 할당량을 더 늘려줬을 때 더 빠른것으로 나옴

 

Quota 10

10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 7.90572 s, 1.3 MB/s

Quota 100

10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.710914 s, 14.7 MB/s

 

728x90