개요
저희 서비스 MODiE는 이미지 리소스 없이 주로 JSON 기반의 텍스트 데이터를 정적 파일 형태로 서빙하는 형태입니다.
입력값 길이 제한과 페이지네이션 기능이 적용되어 있어 위 사진과 같이 JSON 응답 크기가 5kB를 넘지 않는 구조를 가지고 있습니다.
MODiE와 같이 "작은 JSON 파일을 고빈도로 서빙하는 서비스"에 가장 적합한 Web Server를 도출하고자 합니다.
비교군 & 왜 이런 비교군을 잡았나
정적 파일 서빙에서 가장 널리 쓰이는 3대 웹서버+++
웹 서버 구조
Nginx | 비동기 이벤트 기반 |
Apache HTTPD | 멀티 프로세스 기반 |
Caddy | Go 기반 단일 바이너리 |
공통 조건
- 인스턴스 타입: m5.large(non-burstable 인스턴스)→ 성능 편차 없이 공정 비교 가능
- → 모든 웹 서버는 동일한 사양에서 테스트
- 각 웹서버가 최고의 성능을 낼 수 있는 설정 지정
이 세 웹 서버는 단순히 많이 쓰인다는 이유로 선정된 것이 아닙니다. 비동기 기반(Nginx), 멀티 프로세스 기반(Apache), 경량 단일 바이너리(Caddy)처럼 서로 다른 아키텍처를 지닌 웹 서버들을 비교함으로써 MODiE와 같은 작고 빈번한 텍스트 서빙 환경에서 어떤 구조가 가장 효율적인지를 명확히 분석하고자 하였습니다.이는 단순 속도뿐 아니라 실제 서비스 구조에 얼마나 잘 맞는지를 함께 고려한 평가입니다.
테스트에 사용할 도구들 & 왜 이런 도구를 썼냐
부하 생성 인스턴스
타입: c5.large
- K6가 vCPU 2개 기준으로 500~1000명 동접까지 커버 가능
도구: k6
- 경량 JavaScript 기반 부하 테스트 도구
- VU(가상 사용자), 요청 시간, 에러율 등 상세 지표 수집
- CLI로 자동화 용이, Prometheus 연동도 쉬움
- HTTP/1.1 프로토콜 기반으로 테스트 진행→ HTTP/2의 멀티플렉싱, 헤더 압축 등의 이점을 배제하고 웹 서버 자체 성능만을 측정
- → 현재 MODiE의 기본 통신 방식이며
모니터링 인스턴스
- 타입: m5.large
- 2 vCPU, 8GB RAM
- 다중 타겟 모니터링에 안정적인 리소스
- 도구 구성:
- Prometheus - 1860 대시보드 사용
- node_exporter를 통해 각 서버 리소스 실시간 수집
- Pull 방식으로 안정적이며 설정 유연
- Grafana
- 시계열 지표 시각화 도구
- 테스트 중 CPU, RAM, Network I/O 등 실시간 대시보드 확인 가능
- Prometheus - 1860 대시보드 사용
어떻게 & 왜 이런 구조로 테스트하나
같은 vpc안에서 Private IP를 통한 통신으로 NAT Gateway 등의 변수가 될만한 요인을 최대한 제거하였습니다.
이후 더 많은 트래픽을 넣어야 한다면 인스턴스 갯수를 늘리는 방식으로 진행하려합니다.
어떤 데이터를 & 왜 수집하나
성능, 안정성, 자원의 관점에서 데이터를 측정 할 예정입니다.
1. 요청 처리 성능 → k6 로그
수집 지표 수집 이유
req/sec (처리량) | 웹서버가 얼마나 많은 요청을 빠르게 처리할 수 있는지 |
평균 응답 시간 | 전체 사용자에게 제공되는 응답 품질 |
P95 / P99 응답 시간 | 지연 발생 가능성, 최악의 경우 측정 (꼬리 성능) |
→ 사용자가 느끼는 속도 체감과 직접 연결되는 지표
2. 안정성 → k6 로그
수집 지표 수집 이유
에러율 (HTTP 5xx) | 부하 상황에서 서버가 정상 응답을 유지하는지 |
응답 실패율 | 연결 시간 초과, 타임아웃 등 포함한 안정성 전체 평가 |
→ 처리량만 빠르다고 좋은 서버가 아니라 지속 가능한 처리 능력도 중요
3. 서버 리소스 사용량 → 프로메테우스 그라파나
수집 지표 수집 이유
CPU 사용률 | 서버가 부하에 따라 얼마나 과부하되는지 |
Memory 사용량 | 메모리 부족으로 성능 저하나 장애 발생 여부 확인 |
Network I/O | 실제 정적 파일 전송 시 네트워크 병목 여부 확인 |
→ 단순 속도 외에도 서버 자원 효율성까지 함께 분석
시나리오
파일크기 \ 동접자 500명 (A) 1,000명 (B) 10,000명 (C) 100,000명
소형 파일 (1KB) | 🍖 | 🍖 | 🍖 | 🍖 |
중형 파일 (200KB) | 🍖 | 🍖 | 🍖 | 🍖 |
대형 파일 (5MB) | 🍖 | 🍖 | 🍖 | 🍖 |
진행사항
- gzip 설정이 꺼져있는 상태로 nginx, aphache httpd, caddy 서버 세팅 완료
- 각 서버에 1KB, 200KB, 5MB 파일 생성 및 호스팅 연결 완료
- 부하용 K6 서버 세팅 완료
- 모니터링 환경 세팅 완료
- 컨트롤러 노드와 워커 노드 연결 완료
- parallel-ssh를 사용하여 명령을 바로 내릴 수 있는 환경 구성
'DevOps' 카테고리의 다른 글
[DevOps] 5MB 파일 테스트 시 에러율 급증 - 트러블슈팅 기록 (0) | 2025.06.03 |
---|---|
[DevOps] 모니터링 환경 구축 Prometeus, Grafana, Loki, Promtail - Modie (0) | 2025.04.11 |
[DevOps] 백엔드 Prod 서버 ASG 기반 롤링 배포 자동화 - Modie (0) | 2025.04.08 |
[DevOps] 백엔드 DEV서버 단일 EC2 기반 Blue/Green 배포 자동화 - Modie (0) | 2025.04.07 |