티스토리 뷰

728x90
반응형

본 포스팅에서는 Docker로 기동되는 이미지들에 대한 Performance Monitoring에 대해 살펴보겠습니다.

때때로 Kubernetes나 OpenShift 등 다수의 컨테이너가 한번에 기동되는 경우 또는 성능을 모니터링하기 위해 JMeter나 LoadRunner 등의 부하 발생기를 통해 컨테이너에 과부하를 한번에 유입할 경우 해당 Container 뿐만 아니라 OS 전체적인 성능 저하가 발생하는 경우를 볼 수 있습니다.

이때 Kubernetes의 어떤 Container를 다중화하여 성능을 확보해야 하는지 현재 기준 리소스는 얼마나 사용되고 있는지 확인해 보고 싶을 때가 있는데요. APM Tool(datadog, splunk, pagerduty 등)을 포팅해서 모니터링하거나 Dashboard를 통해서 손쉽게 확인할 수도 있지만, CLI 환경에서도 눈으로 먼저 확인해 볼 수 있는 방법이 있습니다.

바로 docker stats라는 명령어 입니다.

docker stats

docker stats는 컨테이너의 리소스 사용량 통계를 실시간으로 보여 주는 Command입니다. docker가 설치되어 있는 환경에서 손쉽게 docker stats로 명령어를 실행할 수 있습니다.

[Container가 기동되어 있지 않은 상태]

[root@elk ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES 
[root@elk ~]# 
[root@elk ~]# docker stats 
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS 

[Container 2개를 기동한 상태]

[root@elk ~]# docker run --name mediawiki -p 8080:80 -d mediawiki 
fc2fb010cf90ae2253954372271f1a78432f6eafec896a3c5131e7da9cb6463a 
[root@elk ~]# docker run -d --name redmine -p 3000:3000 redmine 
af56fd091b95547c05aecd954ebea00d2ca4ef304952d2360aa8551f970ab309 
[root@elk ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES 
74daadf92b45        redmine             "/docker-entrypoin..."   51 seconds ago      Up 50 seconds       0.0.0.0:3000->3000/tcp   redmine 
fc2fb010cf90        mediawiki           "docker-php-entryp..."   10 minutes ago      Up 10 minutes       0.0.0.0:8080->80/tcp     mediawiki 
[root@elk ~]# 
[root@elk ~]# docker stats 
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS 
fc2fb010cf90        0.01%               6.395 MiB / 7.637 GiB   0.08%               1.31 kB / 656 B     0 B / 0 B           6 
af56fd091b95        0.00%               102.7 MiB / 7.637 GiB   1.31%               656 B / 656 B       0 B / 39.2 MB       2 
...

...
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS 
fc2fb010cf90        0.01%               6.395 MiB / 7.637 GiB   0.08%               1.83 kB / 656 B     0 B / 0 B           6 
74daadf92b45        101.59%             24.44 MiB / 7.637 GiB   0.31%               516 B / 516 B       0 B / 6.89 MB       2 

[Container 1개를 다운한 상태]

[root@elk ~]# docker stop 74daadf92b45865f7aa746489c1b492c90addf9b1650997ea520d6dfc61d6e2e 
74daadf92b45865f7aa746489c1b492c90addf9b1650997ea520d6dfc61d6e2e 
[root@elk ~]# docker rm 74daadf92b45865f7aa746489c1b492c90addf9b1650997ea520d6dfc61d6e2e 
74daadf92b45 
[root@elk ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES 
fc2fb010cf90        mediawiki           "docker-php-entryp..."   11 minutes ago      Up 11 minutes       0.0.0.0:8080->80/tcp   mediawiki 
[root@elk ~]# 


CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS 
fc2fb010cf90        0.01%               6.395 MiB / 7.637 GiB   0.08%               1.31 kB / 656 B     0 B / 0 B           6 

위와 같이 docker process가 기동되어 있지 않은 상태에서 docker stats를 실행하면, 메뉴항목만 출력되며

mediawiki & redmine opensource container를 기동하였을 경우 각 container 별 CPU, MEM, NET I/O, BLOCK I/O PIDS를 확인할 수 있습니다.

의미 그대로 해석할 수 있으며, CPU, MEM은 할당된 Resource 대비 사용률, NET I/O는 Network Interface를 통해 전송하고 받는 데이터 량, BLOCK I/O는 블록 디스크에 읽고 쓴 데이터 량 그리고 PIDs는 컨테이너가 생성한 프로세스 또는 쓰레드 수를 의미합니다.

실시간으로 갱신되기 때문에 성능 테스트나 모니터링 시에 유용하게 사용될 수 있을 듯합니다.

그밖에도 유용하게 사용할 수 있는 옵션으로는 아래와 같은 옵션이 있습니다.

[root@elk system]# docker stats --help 

Usage:  docker stats [OPTIONS] [CONTAINER...] 

Display a live stream of container(s) resource usage statistics 

Options: 
  -a, --all             Show all containers (default shows just running) 
      --format string   Pretty-print images using a Go template 
      --help            Print usage 
      --no-stream       Disable streaming stats and only pull the first result 
[root@elk system]#  

a) docker stats --no-stream

반복 출력하지 않고 현 시점의 결과 1회만 출력

[root@elk system]# docker stats --no-stream 
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS 
fc2fb010cf90        0.01%               6.395 MiB / 7.637 GiB   0.08%               1.97 kB / 656 B     0 B / 0 B           6 
[root@elk system]# 

b) docker stats --format string

해당 format을 기준으로 출력 포멧을 변경

[root@elk system]# docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
CONTAINER           CPU %               MEM USAGE / LIMIT 
fc2fb010cf90        0.00%               6.395 MiB / 7.637 GiB  

[root@elk system]# docker stats --format "table {{.Container}}:       {{.CPUPerc}}"
CONTAINER           CPU % 
fc2fb010cf90:       0.01% 

위와 같이 원하는 항목과 원하는 포멧으로 변경하여 출력이 가능합니다.

Format으로 사용가능한 서식은

.Container, .Name, .ID, .CPUPerc, .MemUsage, .NetIO, .BlockIO, MemPerc, .PIDs가 있으며, MemPerc, PIDs는 windows에서는 사용이 불가능합니다.

 

간단하지만 유용하게 Docker Container를 모니터링하는 용도로 사용해 보기 바랍니다.

728x90
반응형