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 |