f-lab-clone / ticketing-infra

[2023] Ticketing Service - PerformanceTest, Terraform, EKS, Grafana
https://github.com/f-lab-clone/ticketing-backend
7 stars 2 forks source link

성능테스트 환경 구축 #32

Closed junha-ahn closed 1 year ago

junha-ahn commented 1 year ago

Description

해당 문서는 학습용 Document

실제 성능테스트 스크립트 작성은 https://github.com/f-lab-clone/ticketing-backend/issues/83 에서 진행

1. Database를 초기화한다

1

2. K6를 통한 성능테스트를 진행한다

2

3. Grafana 대시보드를 통해 결과를 확인한다

3

To do

Test Checklist

junha-ahn commented 1 year ago

성능 테스트 전반적 개념 학습

접기/펼치기 # [[우아한테크] 10분 테크톡 성능 테스트](https://www.youtube.com/watch?v=IcSdPhxCn9Y) - 병목 현상을 확인하고 개선하는 것이 목적 - 임계치 이상의 과부하 상태에서 어떻게 동작하는지 확인 (장애, 자동복구 등) > 부하테스트/스트레스테스트 용어의 정의는 무시. '성능 테스트'로 통일 > 각 용어 정의에 대해서는 이 글을 [참고](https://jins-dev.tistory.com/entry/load-testing-%EA%B3%BC-stress-testing-performance-testing-%EC%97%90-%EB%8C%80%ED%95%9C-%EB%B9%84%EA%B5%90) # [엘리스 CTO가 알려주는 ‘서버 성능 측정 방법’ ](https://www.youtube.com/watch?v=HSNyJnobBws) ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/ddab53c1-f7c7-4ba4-9067-583bfe6abdef) 어느 서버가 더 성능이 좋은가 1. 10명이 동시에 호출했을 때 1초 안에 모두가 응답을 받음 2. 100명이 동시에 호출했을 때 10초 안에 모두가 응답을 받음 Latency : 사용자의 입장에서 응답에 걸리는 시간 Throughput: 작업자의 입장에서 시간당 얼마나 처리하는가 ### 테스트 시나리오 10개의 커넥션 5초동안 연결 - Latency 11.5 ms - 종합해서 1초에 885개의 Request 처리 100개의 커넥션을 5초동안 연결 - Latency 104 ms - 1초당 950개의 Request처리 그렇다면 "우리 서버는 **동시에 950명이 접속해도 안전**합니다"라고 말 할 수 있는가? - 각 유저들은 속도가 느려지는 등... 이건 그저 "**서버가 버틸 수 있을때까지** 최대한 Request를 넣어보는 행위" - 서버의 한계치를 알 수 있지만, 동시접속자를 몇명까지 받을 수 있냐에 답은 아니다. ### 테스트 시나리오 개선 "100명의 유저가 30초동안 Request를 하는데, 인당 1초에 1번씩 Request를 한다" - 집중하는것은, 사람들이 API에서 response를 받는데 얼마나 걸리는가 - 위 테스트는 **얼마나 처리할 수 있고, 그때 Latency가 얼마인가** - 이번 테스트는 **"얼마나 처리할 수 있나"를 고정**하고 그때 Latency가 얼마나 빠른가 1초에 100개씩했을때 Latency가 3ms, 10배를했을때 Latency가 1s - Request는 10배가 늘어났는데 Latency는 300배 느려졌다 ### 어떻게 개선하는가? 1. 서버 대수를 늘린다. ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/fa5ec5e8-bd21-48c8-9f6a-8f2b0739adf7) ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/862bd817-e30f-433e-89ac-67af934c74c6) 2. 코드를 효율화한다. ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/3c80bb44-15a2-4867-9586-488a1a594a98) ## 그래서 우리는 어떻게 할 수 있을까? ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/d388107c-9380-48bd-8496-91d332924eb5) 1. **현실적인 성능 측정 지표**를 설정하고 성능을 개선한다 2. 서버 대수를 최대한 억제하고, **로직을 개선**한다. 3. **서버 대수의 증가로 변화하는 처리능력을 측정**한다 4. "성능 기준"을 정하고 Git actions를 통해 테스트 자동화 5. 서버 구조의 변화를 준다. [[우아콘2020] 배달의민족 마이크로서비스 여행기](https://www.youtube.com/watch?v=BnS6343GTkY) 참고 > 일단 2번까지 도달했으면... 4번의 경우는 너무 긴 여정이 될 것 같다. # [[우아콘] 서버 성능테스트, 클릭 한 번으로 끝내볼 수 있을까](https://www.youtube.com/watch?v=Ovcy02QFt9c)
접기/펼치기 ### 반복되는 부분 ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/12e3b272-ea75-47c7-afca-ec5dbd2eca32) ### 자원 생성 ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/16b6eb17-debf-4773-b8ab-0926a85e016b) ### 테스트 후 결과 기록 ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/4779d979-3a00-4458-8aa4-9663c2ccc6fd) ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/8a847e33-d6ba-40e2-950b-fe465e098d48) ### 자원 정리 ![image](https://github.com/f-lab-clone/ticketing-infra/assets/41976906/26f01d8f-1722-4ab1-9661-2e8f1bcb2871)
junha-ahn commented 1 year ago

어떤 성능테스트 도구를 사용할 것인가?

기준

참고

K6를 사용한다

성능 (single k6 instance)

언제 성능테스트를 자동화를 할 것인가?

성능 최적화 이후 "일정 성능 유지"를 위해 자동화한다

애플리케이션 환경 구성

EKS Cluster를 환경에 따라 구분하지 않는다.

해당 프로젝트의 목적은 '성능테스트' 자체에 있기 때문에 PROD/DEV 환경등의 이중 구성이 필요하지 않다.

애플리케이션 초기화 문제

동일한 환경에서 어떻게 여러번의 부하 테스트를 진행할것인가? 즉 어떻게 초기화할 것인가?

애플리케이션 리소스와 모니터링 환경 및 데이터는 그대로 유지. 그 외 Stateful 리소스의 Data 초기화

향후 제약사항

테스트 환경

고려대상

결정

어떤 레포지토리에서(Infra/Backend) 테스트 스크립트를 작성할 것인가?

향후 Git Actions 테스트 자동화를 위해서는 Backend를 사용한다

로컬에서 DB를 어떻게 초기화할 것인가?

cleanup endpoint를 만든다면?

자동화 스크립트를 구현한다

ticketing-backend/
    load-test/
        bastion.pem # 인프라개발자에게 전달받는다
        run.sh 
        k6-scripts/ 
        db-init/ # db init scripts...

실제 구현시 최대한 의존성을 제거하고, 자동화한다

어떻게 테스트 결과를 출력할 것인가?

두가지 테스트 결과가 존재한다.

  1. 해당 테스트 중 애플리케이션 리소스에서 발생하는 여러 매트릭 (App, DB 상태 등)
  2. K6가 출력하는 결과 (생성한 Virtual User, TPS 등)
    • 물런 TPS와 같은 몇몇 정보는 1번에서도 확인 가능하지만, K6가 출력하는 데이터는 엔드유저 관점

image

K6 Report

애플리케이션 리소스 정보는 어떻게 확인하는가?

K6테스트 결과는 어떻게 확인하는가?

Todo