부하 성능 테스트
- GitLab 13.2에서 도입되었습니다.
부하 성능 테스트를 통해 GitLab CI/CD에서 애플리케이션의 백엔드에 대한 보류 중인 코드 변경의 영향을 테스트할 수 있습니다.
GitLab은 시스템 성능 메트릭을 위해 무료이자 오픈 소스인 k6를 사용합니다.
브라우저 성능 테스트는 클라이언트 브라우저에서 웹 사이트의 성능을 메트릭하는 반면, 부하 성능 테스트는 API, 웹 컨트롤러 등과 같은 애플리케이션 엔드포인트에 대한 여러 유형의 부하 테스트를 수행하는 데 사용될 수 있습니다. 이를 통해 백엔드나 서버가 규모에 맞게 어떻게 수행되는지 테스트할 수 있습니다.
예를 들어, 애플리케이션에서 인기 있는 API 엔드포인트로 여러 동시 GET 호출을 수행하여 성능을 확인할 수 있습니다.
부하 성능 테스트 작동 방식
먼저, .gitlab-ci.yml
파일에서 부하 성능 보고서 artifact를 생성하는 작업을 정의합니다. GitLab은 이 보고서를 확인하여 소스와 대상 브랜치 간의 주요 부하 성능 지표를 비교한 후 Merge Request 위젯에 정보를 표시합니다:
그런 다음 테스트 환경을 구성하고 k6 테스트를 작성해야 합니다.
테스트 완료 후 Merge Request 위젯이 표시하는 주요 성능 지표는 다음과 같습니다:
- Checks: k6 테스트에서 구성된 checks의 퍼센트 성공률.
- TTFB P90: 응답을 받기 시작한 시간인 TTFB(TTFB)의 90번째 백분위 수치.
- TTFB P95: TTFB의 95번째 백분위 수치.
- RPS: 테스트가 달성한 초당 평균 요청 수(RPS) 비율.
.gitlab-ci.yml
에 부하 성능 작업을 추가하는 경우와 같이 부하 성능 보고서에 비교할 데이터가 없는 경우(예: 처음 실행하는 경우), 부하 성능 보고서 위젯이 표시되지 않습니다. 이 보고서가 대상 브랜치(예: main)에서 적어도 한 번 실행된 후에 Merge Request에 표시될 수 있습니다.부하 성능 테스트 작업 구성
부하 성능 테스트 작업 구성은 다음과 같은 몇 가지 부분으로 나뉠 수 있습니다:
- 처리량과 같은 테스트 매개변수 결정.
- 부하 성능 테스트를 위한 대상 테스트 환경 설정.
- k6 테스트 디자인 및 작성.
테스트 매개변수 결정
처음으로 실행할 부하 테스트 유형과 사용 방법(예: 사용자 수, 처리량 등)을 결정해야 합니다.
상기 사항 및 기타 사항에 대한 안내는 k6 문서, 특히 k6 테스트 가이드를 참조하세요.
테스트 환경 설정
부하 성능 테스트에 대한 대부분의 노력은 고부하 테스트를 위해 대상 테스트 환경을 준비하는 데 들어갑니다. 테스트된 처리량을 처리할 수 있는지 확인해야 합니다.
또한, 부하 성능 테스트에 사용될 대상 환경에 대표적인 테스트 데이터가 필요합니다.
프로덕션 환경에서 이러한 테스트를 실행하지 않는 것을 강력히 추천합니다.
부하 성능 테스트 작성
환경을 준비한 후에 k6 테스트 자체를 작성할 수 있습니다. k6는 유연한 도구로 다양한 유형의 성능 테스트를 실행하는 데 사용할 수 있습니다. 테스트 작성에 대한 자세한 정보는 k6 문서를 참조하세요.
GitLab CI/CD에서 테스트 구성
k6 테스트가 준비되면 다음 단계는 GitLab CI/CD에서 부하 성능 테스트 작업을 구성하는 것입니다. 이 작업을 쉽게 수행하는 방법은 GitLab에 포함된 Verify/Load-Performance-Testing.gitlab-ci.yml
템플릿을 사용하는 것입니다.
이 템플릿은 작업에서 k6 Docker 컨테이너를 실행하고 작업을 사용자 정의하는 여러 가지 방법을 제공합니다.
구성 작업 예시:
- Docker 컨테이너를 실행할 GitLab Runner를 설정합니다. 예: Docker-in-Docker workflow.
-
.gitlab-ci.yml
파일에 기본 부하 성능 테스트 CI/CD 작업을 구성합니다. 템플릿을 포함하고 CI/CD 변수로 구성해야 합니다:include: template: Verify/Load-Performance-Testing.gitlab-ci.yml load_performance: variables: K6_TEST_FILE: <프로젝트 내 K6 테스트 파일 경로>
위의 예시는 CI/CD 파이프라인에서 load_performance
작업을 생성하여 k6 테스트를 실행합니다.
Jobs/Load-Performance-Testing.gitlab-ci.yml
.k6는 다양한 옵션을 제공하여 테스트 실행 방식을 구성할 수 있습니다. 예를 들어, 실행할 처리량(RPS)이나 테스트 기간 등. 거의 모든 옵션은 테스트 자체에서 구성할 수 있지만 K6_OPTIONS
변수를 통해 명령줄 옵션을 전달할 수도 있습니다.
예를 들어, 명령줄 옵션으로 테스트 기간을 재정의할 수 있습니다:
include:
template: Verify/Load-Performance-Testing.gitlab-ci.yml
load_performance:
variables:
K6_TEST_FILE: <프로젝트 내 K6 테스트 파일 경로>
K6_OPTIONS: '--duration 30s'
GitLab은 k6 결과가 summary export로 부하 성능 보고서 artifact로 저장된 경우에만 Merge Request 위젯에서 주요 성능 지표를 표시합니다. 가장 최신의 부하 성능 artifact를 사용하여 테스트로부터 요약 값을 가져옵니다.
GitLab Pages가 활성화된 경우에는 브라우저에서 보고서를 직접 확인할 수 있습니다.
Review Apps에서의 성능 테스팅 로드
위의 CI/CD YAML 구성 예제는 정적 환경에서의 테스트에 대해 작동하지만, 몇 가지 추가 단계로 리뷰 앱이나 동적 환경과 함께 작동하도록 확장할 수 있습니다.
가장 좋은 방법은 동적 URL을 .env
파일로 캡쳐하여 공유할 작업 artifacts로 저장한 다음, 우리가 제공한 K6_DOCKER_OPTIONS
라는 사용자 정의 CI/CD 변수를 사용하여 k6 Docker 컨테이너를 구성하여 파일을 사용하는 것입니다. 이를 통해 k6는 표준 JavaScript를 사용하여 스크립트에서 .env
파일의 환경 변수를 사용할 수 있게 됩니다. 예를 들어, http.get(`${__ENV.ENVIRONMENT_URL}`)
와 같이 사용할 수 있습니다.
예를 들어:
-
review
작업에서:- 동적 URL을 캡쳐하고,
.env
파일에 저장하고, 예를 들어,echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env
와 같이합니다. -
.env
파일을 작업 artifacts로 설정합니다.
- 동적 URL을 캡쳐하고,
-
load_performance
작업에서:- 동적 URL을 캡쳐한
review
작업에 의존하도록 설정하여 환경 파일을 상속합니다. -
K6_DOCKER_OPTIONS
변수를 Docker CLI 환경 파일 옵션으로 설정하고, 예를 들어,--env-file review.env
와 같이합니다.
- 동적 URL을 캡쳐한
- k6 테스트 스크립트를 환경 변수를 사용하도록 구성합니다.
.gitlab-ci.yml
파일은 다음과 유사할 수 있습니다:
stages:
- deploy
- performance
include:
template: Verify/Load-Performance-Testing.gitlab-ci.yml
review:
stage: deploy
environment:
name: review/$CI_COMMIT_REF_SLUG
url: http://$CI_ENVIRONMENT_SLUG.example.com
script:
- run_deploy_script
- echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env
artifacts:
paths:
- review.env
rules:
- if: $CI_COMMIT_BRANCH # 규칙 세부사항을 맞추려면 수정하거나 필요한 경우 `only/except`를 사용하세요.
load_performance:
dependencies:
- review
variables:
K6_DOCKER_OPTIONS: '--env-file review.env'
rules:
- if: $CI_COMMIT_BRANCH # 규칙 세부사항을 맞추려면 수정하거나 필요한 경우 `only/except`를 사용하세요.