TIL(Today I Learned)/Apache JMeter Test
[부하 테스트 및 확장성 테스트 - 배포환경] 단일 서버 vs 이중 서버 성능 차이
jiyoon0000
2025. 2. 17. 18:59
테스트 개요
1. 목표
:부하 테스트 및 서버 확장성 테스트 (Load Test & Scalability Test)
- Redis 기반 캐싱을 적용한 상태에서 단일 서버 vs 이중 서버 성능 차이 측정
- 부하 테스트(Load Test) 수행 후 트랜잭션 처리 속도(TPS) 분석
- 서버 확장성 Scaling에 따른 성능 변화 분석
- 정확한 서버의 성능 분석을 위해 극한의 상황으로 테스트
2. 테스트 환경
- 부하 테스트 도구: JMeter
- 성능 측정 방식: TPS(Transactions Per Second) 분석
- 테스트 조건:
- Number of Threads (users) : 200명
- Ramp-up period (seconds) : 20초
- Loop Count: 3000
- 비교환경
- 단일 서버 환경 (EC2 인스턴스 1개)
- 이중 서버 환경 (EC2 인스턴스 2개)
테스트 결과
1. 단일 서버 환경
- 평균 TPS: 약 280 TPS
- 지속적인 부하가 증가하면서 일정 TPS를 유지했으나, 일정 시간이 지나면서 급격한 성능 저하 발생
- 시간이 지남에 따라 서버의 CPU 및 메모리 사용량이 포화 상태에 도달
- 부하가 일정 수준을 넘어서면 응답 시간이 증가하고, 일부 요청 실패(HTTP Request Failure) 또는 타임아웃 발생
- 단일 서버에서 한계점 도달 후 응답률 저하
- 결론
- 단일 서버로는 지속적인 대량 요청을 처리하는 데 한계가 있음 → 서버 이중화 필요!
2. 이중 서버 환경
- 평균 TPS: 약 280 ~ 320 TPS
- 트랜잭션 성공률이 높고, 성능 저하 없이 일정 TPS 유지
- Scaling(서버 확장)을 통해 요청 처리량이 증가하는 것을 확인
- CPU 및 메모리 사용량이 분산되어 단일 서버 대비 안정적인 성능 유지
- 로드 밸런서가 트래픽을 분산하면서 한 서버에 부하가 집중되지 않음
- 결론
- 서버를 수평 확장(Scaling Out)하면서 TPS 자체는 큰 변화가 없었지만 요청 처리량이 증가하며 단일 서버보다 많은 트래픽을 처리할 수 있음
3. 테스트 결과 비교 (+ 그래프)
- 결과 (Scaling Up → Scaling Out)
- 서버 부하가 2개의 서버로 분산되면서 CPU 및 메모리 사용량이 안정적으로 유지됨
- 처리량이 일정하게 유지되었고, 서버가 1개일 때 보다 지속적인 요청 처리 가능
- 서버 한 대 대비 성능이 2배 가까이 증가, 트래픽이 몰려도 안정적인 서비스 운영 가능
테스트 환경 |
평균 TPS | 서버 정상 운영시간 | CPU 사용률 | 부하 지속 가능 여부 |
실패율 |
단일 서버 | 280 TPS -> 급감 |
약 11분 후 서버 다운 | 90% 이상 (포화 상태) | 일정 시간 후 성능저하 | 약 48% |
이중 서버 | 280 ~ 320 TPS -> 안정적 |
약 21분 정상 작동 | 분산으로 CPU 안정적 (평균) | 일정 TPS 유지 | 약 20% |
<왼쪽 : 단일 서버 / 오른쪽 : 이중 서버>
결론
*서버 이중화 적용으로 서버 부하 분산 성공
- 서버 2개로 확장 후, 요청 실패율 48% → 20%로 감소
- CPU 사용량 분산으로 안정적인 서비스 운영 가능
- TPS 유지되며 트래픽 급증에도 서버 정상 작동
- 비용 절감 효과 확인 → 서버 운영 최적화 완료
- 최적의 방식: 서버 이중화 (Scaling Out) 적용
Scale Up -> Scale Out
수직확장 -> 수평확장
*실행한 부하테스트와 확장성 테스트에서 수직확장(Scale Up)과 수평확장(Scale Out)의 개념이 같이 나온 이유
1. Scale Up(Scaling Up) : 수직 확장
- 기존 서버의 성능(스펙)을 높이는 방식으로 확장
- ex> 단일 서버에서 CPU와 메모리를 업그레이드하여 처리 성능을 증가시키는 경우
- 확장방법
- CPU 코어 수 증가
- 메모리(RAM) 추가
- 스토리지(SSD) 업그레이드
- 쿼리 최적화, Redis 캐싱 적용 -> 기존 서버가 처리할 수 있는 용량을 증가 시킨 경우도 포함
- 특징
- 서버의 개수는 그대로 유지
- 성능이 높아지므로 처리량이 증가할 가능성이 높음
- 물리적 한계에 도달하면 더 이상 확장 불가능
2. Scale Out(Scaling Out) : 수평 확장
- 서버의 개수를 늘려 부하를 분산하는 방식
- ex> 단일 서버에서 2개의 서버로 늘려 로드 밸런서를 통해 부하를 분산하는 경우
- 확장 방법
- 여러 개의 서버를 추가하고 로드 밸런서를 사용하여 트래픽 분산
- MSA(마이크로서비스 아키텍쳐) 적용
- 클러스터링을 통해 여러 대의 서버가 같은 역할을 수행
- 특징
- 이론적으로는 무한 확장 가능
- 시스템의 고가용성(HA : High Availability) 보장 가능
- 분산 환경에서 데이터 일관성을 유지하는 것이 중요
3. 이번 테스트의 경우 Scaling Up -> Scaling Out = 혼합 확장(Hybrid Scaling)
- Scale Up
- 쿼리 최적화 및 Redis 캐싱 적용
- 기존 단일 서버의 성능을 개선하여 더 많은 요청을 처리할 수 있도록 함
- 쿼리 최적화 및 Redis 캐싱 적용
- Scale Out
- 단일 서버에서 이중 서버로 확장, 로드 밸런서를 통해 트래픽 분산
- 요청 처리량 증가
- TPS 변화는 적지만 총 요청 수용량 증가
- 단일 서버에서 이중 서버로 확장, 로드 밸런서를 통해 트래픽 분산
- 결론
- 서버 개수만 늘린다고해서 성능이 무조건 좋아지는 것은 아니다.
- 이 테스트를 통해 이런 상황에서는 TPS 증가보다는 요청 처리량 증대가 목표가 되었다는 것을 확인할 수 있었다.
최종 분석
1. 요약
- 단일 서버에서는 지속적인 트래픽을 감당하기 어렵고 일정 시간이 지나면 성능 저하가 발생
- 서버를 하나 추가하여 부하를 분산했을 때 TPS 자체는 큰 변화가 없었으나, 요청 처리량이 증가
- 이번 테스트는 단순한 Scale Out이 아니라 Scale Up과 결합된 Hybrid Scaling 개념으로 진행됨
- 로드밸런싱, DB 최적화, 오토스케일링 도입을 고려
2. 최종 개선 방향
- TPS 성능 향상
- 서버 확장만으로 TPS 성능을 향상하는데 한계가 있기 때문에 DB 쿼리 최적화, Redis 캐싱 구조 개선, 비동기 처리 도입 등의 성능 개선 고려
- 오토 스케일링 적용 고려
- 특정 TPS 이상으로 부하가 급증할 경우 오토스케일링을 적용하여 자동으로 서버를 확장하고 줄이는 방식을 고려
- Scaling 전략 추가 고려
- Scale Up을 더 활용하여 데이터베이스 서버를 수직 확장하거나 캐싱으로 서버를 최적화하는 방법 고려