playdata/daily

17주차 : Day 3 (10/30)

soojin1 2024. 10. 31. 21:53

AWS 에서 blog-1 로드밸런싱 성능 테스트

 

( ngrinder )

$ vi ng-compose.yml

services:
  controller:
    image: ngrinder/controller
    ports:
      - "8888:80"
      - "16001:16001"
      - "12000-12009:12000-12009"
    volumes:
      - ./ngrinder-controller:/opt/ngrinder-controller
  agent:
    image: ngrinder/agent
    links:
      - controller
    depends_on:
      - controller

 

ngrinder를 도커 환경에서 구동하기 위해 컨테이너를 설정하는 파일이다.

controller

  • image: ngrinder/controller: nGrinder의 컨트롤러용 Docker 이미지를 지정합니다.
  • ports: 외부에서 nGrinder 컨트롤러에 접근할 수 있도록 포트를 매핑합니다.
    • 8888:80: 호스트의 8888 포트를 컨테이너 내부의 80 포트와 연결합니다. (일반적으로 웹 인터페이스는 8080을 사용할 때가 많아 확인이 필요합니다.)
    • 16001:16001: nGrinder 에이전트와 컨트롤러 간의 통신에 사용되는 포트입니다.
    • 12000-12009:12000-12009: 에이전트가 컨트롤러와 부하 분산 테스트를 수행할 때 필요한 포트 범위입니다.
  • volumes: 컨트롤러 컨테이너 내의 데이터를 호스트의 파일 시스템에 저장해 컨테이너 재시작 시에도 데이터를 유지합니다.
    • ./ngrinder-controller:/opt/ngrinder-controller: 호스트의 ngrinder-controller 폴더를 컨테이너의 /opt/ngrinder-controller 경로와 연결합니다.

 

agent

  • image: ngrinder/agent: nGrinder 에이전트용 Docker 이미지를 지정합니다.
  • links: agent 컨테이너가 controller 컨테이너와 연결되도록 설정합니다. (Docker Compose 네트워크 내에서는 자동으로 연결이 가능하기 때문에 이 설정은 생략할 수 있습니다.)
  • depends_on: agent가 controller가 준비된 후에 실행되도록 설정합니다. controller가 먼저 실행되어야 테스트를 관리할 수 있기 때문입니다.

-실행

(NG)$ sudo docker compose -f ng-compose.yml up -d

(NG)$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED        STATUS        PORTS                                                                                                                                                                  NAMES
09e9a2f40c2b   ngrinder/agent        "/scripts/run.sh"   19 hours ago   Up 19 hours                                                                                                                                                                          ubuntu-agent-1
5132eab10e86   ngrinder/controller   "/scripts/run.sh"   19 hours ago   Up 19 hours   0.0.0.0:12000-12009->12000-12009/tcp, :::12000-12009->12000-12009/tcp, 0/tcp, 0.0.0.0:16001->16001/tcp, :::16001->16001/tcp, 0.0.0.0:8888->80/tcp, [::]:8888->80/tcp   ubuntu-controller-1

 


(blog)

$ vi compose-docker.yml

name: samdul
services:
  blog:
    build: ./docker/httpd
    expose:
      - 80
    deploy:
      mode: replicated
      replicas: 1
      resources:
        reservations:
          cpus: '0.05'
          memory: 50M
        limits:
          cpus: '0.01'
          memory: 50M
    environment:
      - VIRTUAL_HOST=localhost, 52.78.168.160, 172.31.47.100
      - VIRTUAL_PORT=80

  load_balancer:
    image: nginxproxy/nginx-proxy
    ports:
      - 8949:80
    depends_on:
      - blog
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

 

blog 서비스

이 서비스는 HTTP 서버 역할을 하며, 애플리케이션의 블로그 페이지나 웹 페이지를 제공할 수 있습니다.

  • build: ./docker/httpd: docker/httpd 경로에 있는 Dockerfile을 사용하여 이미지를 빌드합니다. 따라서, 이 디렉토리에 필요한 설정 파일과 Dockerfile이 있어야 합니다.
  • expose: 80: 내부 네트워크에서 blog 서비스의 80 포트를 노출합니다. expose는 다른 Docker 서비스가 이 포트로 접근할 수 있게 해주지만, 외부에서는 접근할 수 없습니다.
  • deploy: blog 서비스의 배포 설정을 정의합니다.
    • mode: replicated: 하나의 컨테이너 인스턴스를 사용합니다.
    • replicas: 1: 하나의 인스턴스만 실행되도록 설정합니다.
    • resources: 서비스가 사용할 CPU와 메모리 자원에 대한 제약을 설정합니다.
      • reservations: 최소 자원 요구 사항으로, CPU는 0.05 코어, 메모리는 50MB를 예약합니다.
      • limits: 최대 자원 사용 제한으로, CPU는 0.01 코어, 메모리는 50MB로 제한합니다.
  • environment: 환경 변수를 설정해 서비스를 설정합니다.
    • VIRTUAL_HOST=localhost, 52.78.168.160, 172.31.47.100: blog 서비스에 연결할 수 있는 도메인 및 IP를 지정합니다.
    • VIRTUAL_PORT=80: 80 포트를 통해 연결하도록 설정합니다.

 

load_balancer 서비스

이 서비스는 Nginx 기반의 로드 밸런서 역할을 합니다. blog 서비스의 부하를 분산시키는 역할을 수행합니다.

  • image: nginxproxy/nginx-proxy: nginx-proxy 이미지를 사용하여 로드 밸런서를 구축합니다. 이 이미지는 Docker 컨테이너의 요청을 자동으로 라우팅하는 기능을 제공합니다.
  • ports: 8949:80: 호스트의 8949 포트를 로드 밸런서 컨테이너의 80 포트에 매핑하여 외부에서 접근할 수 있도록 합니다. 이를 통해 호스트의 8949 포트로 접근 시 load_balancer를 통해 트래픽이 분산됩니다.
  • depends_on: blog 서비스가 먼저 실행된 후에 load_balancer가 실행되도록 설정합니다.
  • volumes: Docker 소켓을 읽기 전용으로 마운트하여 nginx-proxy가 Docker 컨테이너 상태를 실시간으로 확인할 수 있도록 합니다.
    • /var/run/docker.sock:/tmp/docker.sock:ro: 호스트의 Docker 소켓 파일을 컨테이너에 읽기 전용으로 마운트하여, 로드 밸런서가 컨테이너와의 연결 상태를 자동으로 업데이트할 수 있게 합니다.

-실행

(BLOG)$ sudo docker compose up -d
[+] Running 2/2
 ✔ Container samdul-blog-1           Started                                                                 3.2s
 ✔ Container samdul-load_balancer-1  Started                                                                 4.0s

(BLOG)$ sudo docker compose ps
NAME                     IMAGE                    COMMAND                  SERVICE         CREATED          STATUS          PORTS
samdul-load_balancer-1   nginxproxy/nginx-proxy   "/app/docker-entrypo…"   load_balancer   26 seconds ago   Up 22 seconds   0.0.0.0:8949->80/tcp, [::]:8949->80/tcp


# 두 개가 잘 떠있다.
(BLOG)$ sudo docker ps -q
2aad764ffd5d
eca405151321

 

 


이제 ngrinder에 접속해서 부하를 주는 단계이다.

그 전에 실행파일 하나를 만든다.

2초마다 각 Docker 컨테이너의 CPU 및 메모리 사용률을 수집하여 csv 파일을 생성한다.

(BLOG)$ vi stats2csv.sh
#!/bin/bash

# 시작 시간 타임스탬프 (형식: YYYYMMDDHHMMSS)
timestamp=$(date "+%Y%m%d%H%M%S")

# CSV 파일명과 경로 설정 (타임스탬프 포함)
output_file="docker_stats_${timestamp}.csv"

# CSV 헤더 작성
echo "Timestamp,Name,CPU,Memory" > $output_file

# 10초마다 docker stats 실행
while true; do
  # 현재 시간 저장 (형식: YYYY-MM-DD HH:MM:SS)
  timestamp=$(date "+%Y-%m-%d %H:%M:%S")

  # docker stats를 실행하여 1회 측정 후 결과를 파싱
  docker stats --no-stream --format "$timestamp,{{.Name}},{{.CPUPerc}},{{.MemPerc}}" >> $output_file

  # 2초 대기
  sleep 2
done

 

참고로 아래 명령어로 컨테이너의 cpu 사용량을 실시간으로 확인할 수도 있다.

$ sudo docker stats

 

 

ngrinder 설정을 사진과 같이 맞추고 테스트 시작, 동시에 실행파일 수행(./stats2csv.sh)한다.

 

[결과]

결과                         해석

최고 TPS : 42.5    최대 성능으로 초당 42.5개의 트랜잭션을 처리

최고 TPS 전후 BLOG CPU % 임계점 : 0.98최고 TPS 전후에 BLOG 서비스의 CPU 사용률이 약 1% 미만(효율적으로 동작)

최고 TPS 전후 BLOG MEM % 임계점 : 82.94:최고 TPS 상태에서 메모리의 약 83%까지 사용(비교적 많이 사용함)

최고 TPS 전후 LB CPU % 임계점 : 1.07%    트래픽을 효과적으로 분산 처리하며 안정적인 상태

최고 TPS 전후 LB MEM % 임계점 : 3.67%     로드 밸런서가 메모리 자원을 거의 소모하지 않으며 부하를 안정적으로 관리

'playdata > daily' 카테고리의 다른 글

17주차 : Day 4 (10/31)  (7) 2024.10.31
17주차 : Day 2 (10/29)  (2) 2024.10.29
17주차 : Day 1 (10/28)  (2) 2024.10.28
16주차 : Day 1 (10/21)  (1) 2024.10.21
12주차 : Day 5 (9/27)  (1) 2024.09.30