[ 잎-사이 ] nGrinder 성능 테스트

5tr1ker·2024년 8월 31일
0

Spring 성능 최적화

목록 보기
2/2
post-thumbnail

계획

Load 테스트

  • 평소 트래픽과 최대 트래픽일 때 VUser를 계산 후 시나리오를 검증해봅니다.
  • 결과에 따라 개선해보면서 테스트를 반복합니다.

전제조건

  • Target 시스템 범위 : Spring Boot 서버 + MySQL + Redis
  • 데이터 건수 및 크기 : 최소 8만개 ~ 최대 120만
  • 성능 유지 기간 : 30분

지표 설명

  • Users : 동시에 사용할 수 있는 유저 수
  • TPS ( Test per second ) : 초당 처리되는 테스트 수
  • Time : 작업 시간

성능 목표 설정

  • DAU ( 일일 활동 사용자 수 ) : 50,000명 ( 건국대 재적학생 수 10,000 + 교통대학교 재적 학생 수 11,000 + 그 외 학생 + 30,000 )
  • 1명 당 1일 평균 요청 수 : 50 ( 리뷰 + 마켓 조회 )
  • 피크시간대 집중률 : 12배 ( 식사 시간 )

Throughput 계산

  • DAU * 1명당 1일 평균 요청 수
    -> 50,000 * 50 = 2,500,000

  • 1일 평균 요청 수 / 86,400 ( 24시간을 초로 변환 ) = 1일 평균 RPS
    -> 2,500,000 / 86,400 = 28.9

  • 1일 평균 RPS * ( 최대 트래픽 / 평소 트래픽 ) = 1일 최대 RPS
    -> 28.9 * 12 = 347.2

Throughput은 28.9 ( 1일 평균 ) ~ 347.2 ( 1일 최대 )

VUser 계산

VUser: (목표 rps * T) / R

  • R: 시나리오에 포함된 요청의 수 ( 평균 20개 )

  • T: 시나리오 완료 시간보다 큰 값(VUser 반복을 완료하는데 필요한 시간보다 큰 값) = ( 20 * 0.5 ) + 1 = 11

  • 평소 트래픽 VUser : ( 28.9 * 11 ) / 8 = 39.7

  • 최대 트래픽 VUser : ( 347.2 * 11 ) / 8 = 477.4

But.. 보통 VUser 가 80 정도면 무거운 트래픽이 발생하기 때문에 보통 10 ~ 15 정도도 충분하다고 합니다.

테스트 종합 목표

  • 평소 트래픽 VUser: 39
  • 최대 트래픽 VUser: 477
  • Throughput: 28.9 ~ 347.2 이상
  • Latency: 50 ~ 100ms 이하
  • 성능 유지 기간: 30분

시나리오 수립

시나리오 1

상황 : 앱 실행 후 스토어 탐색

로그인 > 메인화면 조회 > 신규 스토어 조회 > 신규 스토어 검색 > Top 12 스토어 조회 > 식음료 조회 ( 최신순, 추천순, 인기순, 별점 높은 순 ) Pageable > 마켓 검색 페이지 > 스토어 검색 후 결과 ( 최신순, 추천순, 인기순, 별점 높은 순 )

시나리오 2

상황 : 스토어에 상세 정보 및 리뷰, 포토 리뷰 조회

Best Top12 리뷰 조회 > 스토어 상세 페이지 진입 > 스토어 리뷰 조회 ( 최신순, 추천순, 인기순, 별점 높은 순 ) Pageable > 포토리뷰 모아보기 조회 > 포토리뷰 상세보기 진입

시나리오 3

상황 : 앱 실행 후 주문

로그인 > 스토어 상세 페이지 진입 > 메뉴, 옵션 조회 > 메뉴, 옵션 선택 후 장바구니 담기 > 쿠폰 조회 > 쿠폰 다운로드 > 장바구니 목록 조회 > 옵션 수정 > 주문하기 > 주문 결과 페이지 조회

시나리오 4

상황 : 앱 파트너쉽 조회 및 작성

로그인 > 파트너쉽 요청 페이지 조회 ( Pageable ) > 파트너쉽 요청 상세보기 > 파트너쉽 댓글 작성 > 파트너쉽 추천 > 파트너쉽 추천 취소

시나리오 5

상황 : 서비스에 대한 이슈 조회

로그인 > 퀘스트 상세페이지 조회 > 마이페이지 조회 > 내 정보 변경 > 공지사항 목록 조회 Pageable > 공지사항 세부 사항 조회 > 이벤트 목록 조회 ( 모든 이벤트, 내가 참여한, 내가 미참여한 이벤트 ) Pageable > 이벤트 세부사항 조회

시나리오 6

상황 : 리뷰 내역, 찜 관리

로그인 > 스토어 상세보기 > 스토어 찜 등록 > 찜한 목록 조회 > 찜한 목록에서 제거 > 리뷰 관리 조회 Pageable ( 리뷰 쓰기, 작성한 리뷰 조회 ) > 작성한 리뷰 중 하나 상세보기

시나리오 7

상황 : 쿠폰 관리, 주문 내역 관리

로그인 > 쿠폰 보관함 조회 Pageable > 주문 내역 조회 Pageable > 주문 상세 내역 조회 > 주문 상세 내역 삭제

테스트 결과

시나리오 1

  • Market 부분은 데이터를 1만 건으로 테스트
ID기능비고
0신규 Market 12개 출력
1인기 Market 12개 추천
2인기 top 12 리뷰 조회
3사용자 퀘스트 조회-
4신규 매장 12개 조회
5메인화면 스토어 검색 결과
6검색 페이지 - History 조회-
7검색 페이지 - History 조회-
8검색 페이지 - 자동 완성-
9검색 페이지 - 인기 검색어 조회-

시나리오 2

ID기능비고
0인기 top 12 리뷰 조회noOffset 최적화 ( 884ms -> 173ms )
1스토어 상세 정보 가져오기-
2스토어 메뉴 정보 가져오기-
3마켓 리뷰 평균 평점-
4포토 리뷰 간략하게 조회-
5리뷰 조회 ( 최신순 ) ( Pageable )커버링 인덱스로 최적화 ( 983ms -> 105ms )
6리뷰 조회 ( 가장 인기있는 ) ( Pageable )커버링 인덱스로 최적화 ( 863ms -> 97ms )
7리뷰 조회 ( 점수 높은 순 ) ( Pageable )커버링 인덱스로 최적화 ( 901ms -> 105ms )
8리뷰 조회 ( 점수 낮은 순 ) ( Pageable )커버링 인덱스로 최적화 ( 903ms -> 101ms )
9포토 리뷰 가져오기 ( Pageable )-
10포토 리뷰 갯수 가져오기-
11포토 리뷰 상세보기-

시나리오 3

ID기능비고
0스토어 상세 정보 가져오기-
1스토어 메뉴 정보 가져오기-
2메뉴 옵션 정보 가져오기-
3메뉴와 옵션 선택 후 장바구니 넣기-
4쿠폰 정보 가져오기-
5쿠폰 다운로드-
6장바구니 목록 조회-
7메뉴 옵션 변경-
8주문전 주문 정보 가져오기-
9주문하기-
10나의 주문내역 가져오기 ( Pageable )커버링 인덱스 최적화 ( 858ms -> 126ms )

시나리오 4

ID기능비고
0파트너쉽 목록 가져오기 ( Pageable )커버링 인덱스 최적화 ( 1,006ms -> 222ms )
1파트너쉽 상세 데이터 가져오기-
2파트너쉽 댓글 가져오기 ( Pageable )noOffset 최적화 ( 718ms -> 126ms )
3파트너쉽 추천 및 추천 취소-
4파트너쉽 댓글 작성-
5인기있는 파트너쉽 가져오기-

시나리오 5

ID기능비고
0퀘스트 상세보기-
1마이페이지 정보 보기-
2내 정보 변경-
3공지사항 목록 가져오기 ( Pageable )커버링 인덱스로 최적화 ( 408ms -> 49ms )
4공지사항 상세 데이터 가져오기-
5이벤트 목록 가져오기 ( Pageable )noOffset 으로 최적화 ( 422ms -> 47ms )
6이벤트 세부 정보 가져오기-

시나리오 6

ID기능비고
0스토어 찜 등록, 찜 제거-
1스토어 찜 목록 조회 ( Pageable )noOffset 최적화 ( 457ms -> 34ms )
2스토어 찜 갯수 조회-
3리뷰 작성 갯수 작성 가능 갯수 조회-
4리뷰 작성 가능 주문 조회 ( Pageable )커버링 인덱스 최적화 ( 338ms -> 32ms )
5작성한 리뷰 모아보기 조회 ( Pageable )커버링 인덱스 최적화 ( 391ms -> 30ms )
6작성한 리뷰 상세보기-

시나리오 7

ID기능비고
0다운로드 받은 쿠폰 조회-
1다운로드 받은 쿠폰 갯수 조회-
2내 주문내역 가져오기 ( Pageable )커버링 인덱스로 최적화 ( 452ms -> 98ms )
3주문 상세 내역 가져오기-

테스트 정리

시나리오평균 MTT
시나리오 1174.8
시나리오 2105.2
시나리오 3206.6
시나리오 4151.6
시나리오 552.14
시나리오 652.8
시나리오 7100.5
전체120.52

참고 블로그

참고 1 : https://thalals.tistory.com/288
참고 2 : https://leezzangmin.tistory.com/42
참고 3 : https://velog.io/@max9106/nGrinderPinpoint-test1

profile
https://github.com/5tr1ker

0개의 댓글