
1. 성능 테스트란?
프로젝트가 마무리되는 시점에서 다양한 성능 테스트를 통해 서버의 내구도를 확인하고 싶었습니다. 우선, 성능 테스트란 API 요청이 많은 상황에서 서버가 어떻게 동작하는지 확인하는 테스트 입니다. 시스템이 서비스가 정상적으로 제공할 수 있는 상태인 가용성을 높이기 위해 성능 테스트를 실시합니다. 또한, "초당 1000건의 요청 처리 + 모든 조회 요청을 1초 이내로 응답"과 같은 목표치를 달성하기 위해서도 성능 테스트를 진행할 수 있습니다. 이번 블로그에서는
2. 성능 테스트 지표
성능 테스트에서 주의 깊게 봐야 할 지표는 크게 "처리량"과 "응답 시간"입니다.

"처리량"은 초당 처리하는 작업의 수 (TPS: Transactions Per Second) 입니다. 처리량은 서브시스템 중 가장 처리량이 낮은 부분으로 계산될 수 있습니다. 예를 들어, 클라이언트에서 서버로의 요청이 500TPS 이고 서버에서 데이터베이스로의 요청이 300TPS이면 백엔드 서버의 전체 처리량은 300TPS 입니다. 즉, 서버의 처리량을 개선하기 위해서는 병목 구간을의 성능을 개선할 필요가 있습니다.
"응답 시간"은 시스템이 요청을 받고 응답할 때 까지의 시간을 의미합니다. 응답 시간은 시스템이 요청을 처리할 때까지 대기하는 시간도 포함됩니다. 응답 시간은 각 서브시스템 응답 시간의 총합으로 계산할 수 있습니다. 즉, 응답 시간의 경우 어떤 부분을 개선하더라도 총 시스템의 응답 시간에 영향을 줄 수 있습니다.
3. 성능 테스트 종류
- 스모크 테스트
- 최소한의 부하를 주어 시스템이 정상적으로 동작하는지 확인하는 테스트
- 부하 테스트를 공격적으로 실시하기 전에 테스트 스크립트가 정상적으로 동작하는지 확인하기 위함
- 스파이크 테스트
- 사용량이 짧은 시간에 급증하는 상황에서 시스템이 견디고 성능에 문제가 없는지 확인하는 테스트
- 부하 테스트
- 시스템이 운영 환경에서 예상되는 사용자의 부하를 견딜 수 있는지
- 부하 테스트에서 응답 시간, 처리량, 에러율을 측정하여 소프트웨어의 성능 목표치에 도달할 수 있음
- 스트레스 테스트
- 과부하 상태에서 어떻게 동작하는지 확인하고 개선하는 것이 목적
- 시스템에 최대치에 해당하는 부하를 받았을 때 시스템이 어떻게 동작하는지 확인
- 부하 테스트 대비 150% 아니면 그 이상의 부하를 주어 테스트를 진행
- 내구 테스트
- 평균 사용률로 일정 부하를 지속적으로 주며 시스템이 문제되는 지정을 확인하는 테스트
- 메모리 누수 문제와 같이 시스템을 장기간 켜두었을 때 발생하는 문제를 내구 테스트를 통해 확인할 수 있음
- 중단점 테스트
- 임계 지점을 찾기 위해 부하를 점진적으로 증가시키며 진행하는 테스트
- 시스템 한계 지점을 파악할 수 있음
4. 성능 테스트 실습
실제로 성능 테스트를 실행하기 위해서 JMeter를 사용했습니다. JMeter는 Apache에서 Java로 만든 웹 어플리케이션 성능 테스트 오픈 소스로 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트라거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있습니다.
1. 쓰레드 그룹 생성: 테스트 계획 우클릭 -> 추가 -> 쓰레드들 -> 쓰레드 그룹

- Number of Threads: 가상 사용자를 몇 명으로 설정할지
- Ramp-up 시간: 쓰레드 수들을 얼마 시간 동안 테스트할지 ex) 쓰레드 수: 100, Ramp-up:10인 경우, 1초에 10번씩 요청이 전송
- Loop Count: 사용자들이 몇번 요청하는지 ex) 쓰레드: 100, 루프 카운트: 10인 경우, 100명이 10번씩 요청해서 총 1000번의 요청
- Duration: 몇 초 동안 테스트를 실행할 지, Duration에 설정한 시간이 끝나면 테스트가 자동 종료됨
2. HTTP Request 생성: 쓰레드 그룹 우클릭 -> 추가 -> 표본추출기(Sampler) -> HTTP Request을 선택

- 현재 개발중인 프로젝트 개발 서버에 있는 백엔드 API(인기 프로젝트 3개를 응답하는 API)를 호출
- 인증이 필요한 API인 경우: 쓰레드 그룹 우클릭 -> 추가 -> Config Element -> HTTP Header Manager을 선택하여 추가
3. 리스너 추가: 쓰레드 그룹 우클릭 -> 추가 -> 리스너 -> 결과들의 트리 보기, 요약 보고서, 결과 그래프

- 테스트 결과를 시각화하기 위해서 위와 같은 리스너를 추가합니다.
4. 테스트 리포트 생성

- 앞서 리스너로 만들어 두었던 View Result Tree에서 결과들을 저장할 파일을 선택합니다. (여기서 파일의 확장자를 .csv로 변경해야 합니다!!)
- 이전 테스트 이력을 제거한 후에 다시 테스트를 실행합니다

- 도구 > HTML 보고서 생성 메뉴를 클릭
- 앞서 생성해둔 csv파일 선택
- bin폴더 내에 있는 jmeter.properties 파일을 선택
- 출력 디렉토리는 반드시 빈 디렉토리를 선택!!
5. 성능 테스트 결과
최근에 읽기 성능을 향상 시키기 위해서 RDS를 하나 사용하는 단일 데이터베이스 구조에서 EC2를 두 개 사용하여 데이터베이스를 다중화했습니다. 아래 결과는 데이터베이스를 다중화하기 전과 후를 비교한 결과입니다.
1. 부하 테스트: 동시 접속 500명, 1시간 동안 지속 부하, 응답 시간 및 처리량 측정


- Response Time 약 12.5% 감소
- 평균: 360ms → 314ms
- 최댓값: 3992ms → 3400ms
- 최솟값: 34ms → 29ms
- 0% 달성: RDS를 하나 사용했을 때는, 부하 테스트에서 21개의 요청이 Fail 했지만 데이터베이스 다중화 후에는 모든 요청이 성공했습니다.
2. 스트레스 테스트: 5분 동안 동시 접속자 1500명으로 점진적 증가


- Response Time 약 10% 감소
- 평균: 70ms → 63 ms
- 최댓값: 394ms → 246ms
- 최솟값: 53ms → 49ms
3. 스파이크 테스트: 3초 동안 동시접속자 1000명 즉시 증가


- 3초 동안 1000개의 요청에 대해 오류율 약 11% 감소: 34.8% → 23.2% (Error Rate)
참고 자료
https://creampuffy.tistory.com/209
Apache JMeter를 이용한 부하 테스트 및 리포트 생성
서버의 성능을 최적화하기 위해선 어떤 작업이 필요할까요? 어떤 지표를 기준으로 성능을 측정할 것인지, 정의된 지표에 영향을 미치는 변수에는 무엇이 있는지, 해당 변수들의 변화가 성능에
creampuffy.tistory.com