부하 성능 테스트

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

부하 성능 테스트를 사용하면 애플리케이션의 백엔드에 대한 보류 중인 코드 변경 사항의 영향을 테스트할 수 있습니다
GitLab CI/CD에서.

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

브라우저 성능 테스트와는 달리,
이는 클라이언트 브라우저에서 웹 사이트 성능을 측정하는 데 사용되며,
부하 성능 테스트는 API, 웹 컨트롤러 등과 같은 애플리케이션 엔드포인트에 대해
여러 유형의 부하 테스트를 수행하는 데 사용될 수 있습니다.
이를 통해 백엔드 또는 서버가 대규모로 성능을 발휘하는지 테스트할 수 있습니다.

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

부하 성능 테스트 작동 방식

우선, .gitlab-ci.yml 파일에서
부하 성능 보고서 아티팩트를 생성하는 작업을 정의하세요.
GitLab은 이 보고서를 확인하고, 소스와 대상 브랜치 간의 주요 부하 성능 메트릭을 비교한 후
병합 요청 위젯에 정보를 표시합니다:

부하 성능 위젯

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

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

  • Checks: k6 테스트에서 구성된 체크의 통과율.
  • TTFB P90: 응답을 받기 시작하는 데 걸린 시간의 90번째 백분위수, 즉 첫 바이트까지의 시간 (TTFB).
  • TTFB P95: TTFB의 95번째 백분위수.
  • RPS: 테스트에서 달성할 수 있었던 초당 평균 요청 수(RPS).
note
부하 성능 보고서에 비교할 데이터가 없을 경우, 즉 .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 템플릿을 사용하는 것입니다.

note
대규모 k6 테스트를 수행하려면 실제 테스트를 수행하는 GitLab Runner 인스턴스가 테스트를 실행할 수 있어야 합니다. 사양 세부정보는 k6의 가이드를 참조하세요. 기본 공유 GitLab.com 러너는 대부분의 대규모 k6 테스트를 처리하기에 충분하지 않을 수 있습니다.

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

예시 구성 워크플로우:

  1. GitLab Runner를 설정하여 Docker 컨테이너를 실행합니다, 예를 들어 Docker-in-Docker 워크플로우.
  2. .gitlab-ci.yml 파일에서 기본 부하 성능 테스트 CI/CD 작업을 구성합니다. 템플릿을 포함시키고 CI/CD 변수를 사용하여 구성해야 합니다:

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

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

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

k6는 테스트를 실행하는 방법을 구성할 수 있는 다양한 옵션이 있으며, 예를 들어 어떤 처리량(RPS)으로 실행할지, 테스트가 얼마나 오래 실행되어야 하는지 등의 옵션을 설정할 수 있습니다. 거의 모든 옵션은 테스트 자체에서 구성할 수 있지만, K6_OPTIONS 변수를 통해 CLI 옵션을 전달할 수도 있습니다.

예를 들어, CLI 옵션으로 테스트의 지속 시간을 재정의할 수 있습니다:

  include:
    template: Verify/Load-Performance-Testing.gitlab-ci.yml

  load_performance:
    variables:
      K6_TEST_FILE: <PROJECT 내 K6 테스트 파일의 경로>
      K6_OPTIONS: '--duration 30s'

GitLab은 k6의 결과가 summary export를 통해 부하 성능 보고서 아티팩트로 저장된 경우에만 MR 위젯에 주요 성능 지표를 표시합니다. 항상 최신 부하 성능 아티팩트가 사용되며, 테스트의 요약 값이 사용됩니다.

GitLab Pages가 활성화되어 있다면, 브라우저에서 보고서를 직접 볼 수 있습니다.

검토 앱에서의 로드 성능 테스트

위의 CI/CD YAML 구성 예시는 정적 환경에 대한 테스트에 적합하지만,

몇 가지 추가 단계를 통해 검토 앱 또는

동적 환경에서 사용할 수 있도록 확장할 수 있습니다.

가장 좋은 접근 방식은 동적 URL을 .env 파일

작업 아티팩트로 캡처하여 공유하는 것입니다. 그런 다음,

우리가 제공한 K6_DOCKER_OPTIONS라는 사용자 지정 CI/CD 변수를 사용하여

k6 Docker 컨테이너가 파일을 사용하도록 구성합니다. 이렇게 하면 k6는

표준 JavaScript를 사용하여 .env 파일의 환경 변수를 사용하여

스크립트에서 http.get(`${__ENV.ENVIRONMENT_URL}`)와 같이 사용할 수 있습니다.

예를 들어:

  1. review 작업에서:
    1. 동적 URL을 캡처하고 .env 파일에 저장합니다. 예를 들어, echo "ENVIRONMENT_URL=$CI_ENVIRONMENT_URL" >> review.env를 사용합니다.
    2. .env 파일을 작업 아티팩트로 설정합니다.
  2. load_performance 작업에서:
    1. 검토 작업에 의존하도록 설정하여 환경 파일을 상속받습니다.
    2. 환경 파일에 대한 Docker CLI 옵션을 사용하여 K6_DOCKER_OPTIONS 변수를 설정합니다. 예: --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`를 사용하세요.