Load Performance Testing

Tier: 프리미엄, 얼티밋 Offering: GitLab.com, Self-managed, GitLab Dedicated

로드 성능 테스트를 통해 GitLab CI/CD에서 어떠한 보류 중인 코드 변경이 애플리케이션의 백엔드에 미치는 영향을 테스트할 수 있습니다.

GitLab은 애플리케이션의 시스템 성능을 측정하기 위해 무료이자 오픈 소스인 k6 도구를 사용합니다.

브라우저 성능 테스팅이 웹 사이트가 클라이언트 브라우저에서 어떻게 수행되는지 측정하는 반면, 로드 성능 테스트는 API, 웹 컨트롤러 등 애플리케이션 엔드포인트에 대한 다양한 유형의 로드 테스트를 수행하는 데 사용될 수 있습니다. 이를 사용하여 백엔드 또는 서버가 규모에 맞게 어떻게 수행되는지 테스트할 수 있습니다.

예를 들어, 로드 성능 테스트를 사용하여 애플리케이션에서 인기 있는 API 엔드포인트로 다수의 동시 GET 호출을 수행하여 수행 방식을 확인할 수 있습니다.

로드 성능 테스트 작동 방식

먼저, .gitlab-ci.yml 파일에서 로드 성능 보고서 artifact 생성하는 작업을 정의합니다. GitLab은 이 보고서를 확인하여 소스 브랜치와 타겟 브랜치 간의 주요 로드 성능 메트릭을 비교하고, 그 정보를 병합 요청 위젯에 표시합니다.

로드 성능 위젯

다음으로, 테스트 환경을 구성하고 k6 테스트를 작성해야 합니다.

테스트가 완료된 후 병합 요청 위젯에서 표시되는 주요 성능 메트릭은 다음과 같습니다:

  • Checks: k6 테스트에서 설정된 checks의 통과율(%).
  • TTFB P90: 응답을 받기 시작하는 데 걸린 시간인 Time to First Byte(TTFB)의 90번째 백분위 수치.
  • TTFB P95: TTFB의 95번째 백분위 수치.
  • RPS: 테스트가 달성한 초당 평균 요청 수(RPS).

참고: 로드 성능 보고서에 비교할 데이터가 없을 경우, 즉, .gitlab-ci.yml에 로드 성능 작업을 처음 추가하는 경우와 같이 로드 성능 보고서 위젯이 표시되지 않습니다. 해당 브랜치(main 등)에 대상 브랜치에서 적어도 한 번 실행해야 표시됩니다.

로드 성능 테스트 작업 구성

로드 성능 테스트 작업을 구성하는 것은 몇 가지 구분된 부분으로 나눌 수 있습니다:

  • 처리량 등 테스트 매개변수 결정
  • 로드 성능 테스트용 대상 테스트 환경 설정
  • k6 테스트 설계 및 작성

테스트 매개변수 결정

먼저 실행할 로드 테스트 유형 및 실행 방식(예: 사용자 수, 처리량 등)을 결정해야 합니다.

상기 사항 및 기타 사항에 대한 안내는 k6 문서 및 특히 k6 테스트 가이드를 참조하십시오.

테스트 환경 설정

로드 성능 테스트 주변의 많은 노력 중 하나는 고부하에 대비한 대상 테스트 환경을 준비하는 것입니다. 테스트 환경이 테스트한 처리량을 처리할 수 있는지 확인해야 합니다.

또한, 로드 성능 테스트를 위해 대상 환경에 대표 데이터가 일반적으로 필요합니다.

우리는 운영 환경에서 이러한 테스트를 실행하지 말라고 강력히 권장합니다.

로드 성능 테스트 작성

환경이 준비되면 k6 테스트를 작성할 수 있습니다. k6는 유연한 도구이며 다양한 종류의 성능 테스트를 실행하는 데 사용될 수 있습니다. 테스트 작성에 대한 자세한 정보는 k6 문서를 참조하십시오.

GitLab CI/CD에서 테스트 구성

k6 테스트가 준비되면 로드 성능 테스트 작업을 GitLab CI/CD에서 구성해야 합니다. 이를 위한 가장 쉬운 방법은 GitLab과 함께 제공되는 Verify/Load-Performance-Testing.gitlab-ci.yml 템플릿을 사용하는 것입니다.

참고: 대규모 k6 테스트를 위해서는 실제 테스트를 수행하는 GitLab Runner 인스턴스가 테스트를 처리할 수 있는지 확인해야 합니다. 사양에 대한 자세한 내용은 k6의 안내를 참조하십시오. 기본 공유 GitLab.com 러너는 대부분의 대규모 k6 테스트를 처리하기에는 사양이 충분하지 않을 수 있습니다.

이 템플릿은 작업에서 k6 Docker 컨테이너를 실행하며 작업을 사용자 정의하는 여러 가지 방법을 제공합니다.

구성 워크플로 예:

  1. Docker-in-Docker 워크플로(여기)와 같이 GitLab Runner를 구성하여 Docker 컨테이너를 실행합니다.
  2. .gitlab-ci.yml 파일에서 기본 로드 성능 테스팅 CI/CD 작업을 구성합니다.

    include:
      template: Verify/Load-Performance-Testing.gitlab-ci.yml
    
    load_performance:
      variables:
        K6_TEST_FILE: <프로젝트 내의 K6 테스트 파일 경로>
    

상기 예시는 CI/CD 파이프라인에 load_performance 작업을 생성하여 k6 테스트를 실행합니다.

참고: Kubernetes 설정의 경우 다른 템플릿을 사용해야 합니다: Jobs/Load-Performance-Testing.gitlab-ci.yml.

k6는 테스트를 실행하는 방법을 구성하는 여러 옵션을 가지고 있습니다. 예를 들어, 테스트 기간을 CLI 옵션으로 재정의할 수 있습니다:

  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로 저장된 경우에만 병합 요청 위젯에 주요 성능 메트릭을 표시합니다. 사용 가능한 가장 최신의 로드 성능 artifact를 이용하여 테스트의 요약값을 사용합니다.

만약 GitLab Pages가 활성화된 경우, 보고서를 직접 브라우저에서 확인할 수 있습니다.

Review Apps에서 성능 테스트 로드하기

위의 CI/CD YAML 구성 예제는 정적 환경에 대한 테스트에 대해 작동하지만, 리뷰 앱 또는 동적 환경과 함께 작동하도록 확장할 수 있습니다.

가장 좋은 방법은 동적 URL을 .env 파일에 작업 artifact로 저장한 다음, 제공된 사용자 정의 CI/CD 변수 K6_DOCKER_OPTIONS를 사용하여 k6 도커 컨테이너를 구성하는 것입니다. 이렇게 함으로써 k6는 표준 JavaScript를 사용하여 스크립트에서 .env 파일의 환경 변수를 사용할 수 있게 됩니다. 예를들어: http.get(`${__ENV.ENVIRONMENT_URL}`).

예를들어:

  1. review 작업에서:
    1. 동적 URL을 캡처하고 .env 파일에 저장하십시오. 예: echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env.
    2. .env 파일을 작업 artifact로 설정하십시오.
  2. load_performance 작업에서:
    1. 리뷰 작업에 의존하도록 설정하여 환경 파일을 상속하도록 하십시오.
    2. K6_DOCKER_OPTIONS 변수를 환경 파일용 Docker CLI 옵션으로 설정하십시오. 예: --env-file review.env.
  3. 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`를 사용하거나 파이프라인 규칙을 수정하십시오.