자습서: 부하 테스트를 실행하여 웹앱에서 성능 병목 상태 식별

이 자습서에서는 Azure Load Testing을 사용하여 웹 애플리케이션의 성능 병목 상태를 식별하는 방법을 알아봅니다. 샘플 Node.js 웹 애플리케이션에 대한 부하를 시뮬레이션한 다음, 부하 테스트 대시보드를 사용하여 클라이언트 쪽 및 서버 쪽 메트릭을 분석합니다.

샘플 애플리케이션은 NoSQL 데이터베이스와 상호 작용하는 Node.js 웹 API로 구성됩니다. 웹 API를 Azure App Service 웹앱에 배포하고 Azure Cosmos DB를 데이터베이스로 사용합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 샘플 앱 배포
  • 부하 테스트 만들기 및 실행을 참조하세요.
  • 부하 테스트에 Azure 앱 구성 요소를 추가합니다.
  • 부하 테스트 대시보드를 사용하여 성능 병목 상태를 식별합니다.

필수 조건

  • 활성 구독이 있는 Azure 계정. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • 로컬 컴퓨터에 설치된 Azure CLI
  • Azure CLI 버전 2.2.0 이상. 컴퓨터에 설치된 버전을 찾으려면 az --version을 실행합니다. Azure CLI를 설치하거나 업그레이드해야 하는 경우 Azure CLI 설치 방법을 참조하세요.
  • Visual Studio Code 아직 없으면 다운로드하여 설치합니다.
  • Git 아직 없으면 다운로드하여 설치합니다.

필수 구성 요소 확인

시작하기 전에 현재 환경의 유효성을 검사합니다.

샘플 애플리케이션 배포

이 자습서에서는 Azure App Service에 배포하는 샘플 웹 애플리케이션에 대한 부하를 생성합니다. Azure CLI 명령, Git 명령, PowerShell 명령을 사용하여 Azure 구독에 샘플 애플리케이션을 배포합니다.

  1. Windows PowerShell을 열고, Azure에 로그인하고, 구독을 설정합니다.

    az login
    az account set --subscription <your-Azure-Subscription-ID>
    
  2. 샘플 애플리케이션의 원본 리포지토리를 복제합니다.

    git clone https://github.com/Azure-Samples/nodejs-appsvc-cosmosdb-bottleneck.git
    

    샘플 애플리케이션은 Azure App Service 웹 구성 요소와 Azure Cosmos DB 데이터베이스로 구성되는 Node.js 앱입니다. 리포지토리에는 샘플 앱을 Azure 구독에 배포하는 PowerShell 스크립트가 포함되어 있습니다. 나중에 사용할 Apache JMeter 스크립트도 들어 있습니다.

  3. Node.js 앱의 디렉터리로 이동한 후 다음 PowerShell 스크립트를 사용하여 샘플 앱을 배포합니다.

    cd nodejs-appsvc-cosmosdb-bottleneck
    .\deploymentscript.ps1
    

    Linux/WSL 또는 macOS에 PowerShell을 설치할 수 있습니다.

    설치한 후에는 이전 명령을 pwsh ./deploymentscript.ps1로 실행할 수 있습니다.

  4. 프롬프트에서 다음 정보를 입력합니다.

    • Azure 구독 ID.
    • 웹앱의 고유한 이름
    • 위치 기본적으로 이 위치는 eastus입니다. Get-AzLocation 명령을 실행하여 지역 코드를 얻을 수 있습니다.

    Important

    웹앱 이름에는 소문자와 숫자만 허용됩니다. 공백이나 특수 문자는 사용하지 마세요.

  5. 배포가 완료되면 브라우저 창에서 https://<yourappname>.azurewebsites.net을 열어 실행 중인 샘플 애플리케이션으로 이동합니다.

이제 샘플 애플리케이션을 배포하고 실행하고 있으므로 Azure 부하 테스트 리소스와 부하 테스트를 만들 수 있습니다.

부하 테스트 만들기

이 자습서에서는 JMeter 테스트 스크립트(jmx 파일)를 업로드하여 Azure CLI를 사용하여 부하 테스트를 만듭니다. 샘플 애플리케이션 리포지토리에는 부하 테스트 구성 파일과 JMeter 테스트 스크립트가 이미 포함되어 있습니다.

Azure Portal을 사용하여 부하 테스트를 만들려면 빠른 시작: JMeter 스크립트를 사용하여 부하 테스트 만들기의 단계에 따릅니다.

다음 단계에 따라 Azure CLI를 사용하여 Azure 부하 테스트 리소스와 부하 테스트를 만듭니다.

  1. 터미널 창을 열고 다음 명령을 입력하여 Azure 구독에 로그인합니다.

    az login
    
  2. 샘플 애플리케이션 디렉터리로 이동합니다.

    cd nodejs-appsvc-cosmosdb-bottleneck
    
  3. Azure 부하 테스트 리소스에 대한 리소스 그룹을 만듭니다.

    필요에 따라 이전에 배포한 샘플 애플리케이션의 리소스 그룹을 다시 사용할 수도 있습니다.

    <load-testing-resource-group-name> 텍스트 자리 표시자를 리소스 그룹의 이름으로 바꿉니다.

    resourceGroup="<load-testing-resource-group-name>"
    location="East US"
    
    az group create --name $resourceGroup --location $location
    
  4. az load create 명령을 사용하여 Azure 부하 테스트 리소스를 만듭니다.

    <load-testing-resource-name> 텍스트 자리 표시자를 부하 테스트 리소스의 이름으로 바꿉니다.

    # This script requires the following Azure CLI extensions:
    # - load
    
    loadTestResource="<load-testing-resource-name>"
    
    az load create --name $loadTestResource --resource-group $resourceGroup --location $location
    
  5. az load test create 명령을 사용하여 샘플 애플리케이션에 대한 부하를 시뮬레이션하기 위한 부하 테스트를 만듭니다.

    <web-app-hostname> 텍스트 자리 표시자를 샘플 애플리케이션의 App Service 호스트 이름으로 바꿉니다. 이 값의 형식은 myapp.azurewebsites.net입니다. URL의 https:// 부분은 포함하지 마세요.

    testId="sample-app-test"
    webappHostname="<web-app-hostname>"
    
    az load test create --test-id $testId --load-test-resource $loadTestResource --resource-group $resourceGroup --load-test-config-file SampleApp.yaml --env webapp=$webappHostname
    

    이 명령은 SampleApp.jmx JMeter 테스트 스크립트를 참조하는 Sampleapp.yaml 부하 테스트 구성 파일을 사용합니다. 명령줄 매개 변수를 사용하여 샘플 애플리케이션 호스트 이름을 부하 테스트에 전달합니다.

이제 Azure 구독의 샘플 웹 애플리케이션에 대한 부하를 생성할 Azure 부하 테스트 리소스와 부하 테스트가 준비되었습니다.

애플리케이션을 모니터링할 Azure 앱 구성 요소 추가

Azure Load Testing을 사용하면 애플리케이션의 Azure 구성 요소에 대한 리소스 메트릭을 모니터링할 수 있습니다. 이러한 서버 쪽 메트릭을 분석하여 Azure Load Testing 대시보드에서 직접 애플리케이션의 성능 및 안정성 문제를 식별할 수 있습니다.

이 자습서에서는 App Service, Cosmos DB 계정 등 Azure에 배포한 샘플 애플리케이션의 Azure 구성 요소를 추가합니다.

샘플 애플리케이션의 Azure 앱 구성 요소를 부하 테스트에 추가하려면 다음을 수행합니다.

  1. Azure Portal에서 Azure Load Testing 리소스로 이동합니다.

  2. 왼쪽 창에서 테스트를 선택하여 부하 테스트 목록을 봅니다.

  3. 부하 테스트 옆에 있는 확인란을 선택한 다음 편집을 선택합니다.

    Screenshot that shows the list of load tests in the Azure portal, highlighting how to select a test from the list and the Edit button to modify the load test configuration.

  4. 모니터링 탭으로 이동한 다음 추가/수정을 선택합니다.

  5. 앞서 배포한 샘플 애플리케이션에 대한 확인란을 선택한 다음 적용을 선택합니다.

    Screenshot that shows how to add app components to a load test in the Azure portal.

    리소스 그룹 필터를 사용하여 샘플 애플리케이션 리소스 그룹의 Azure 리소스만 볼 수 있습니다.

  6. 적용을 선택하여 부하 테스트 구성에 대한 변경 내용을 저장합니다.

부하 테스트가 실행되는 동안 모니터링 서버 쪽 메트릭을 사용하도록 설정하기 위해 샘플 애플리케이션에 대한 Azure 앱 구성 요소를 부하 테스트에 성공적으로 추가했습니다.

부하 테스트 실행

이제 부하 테스트를 실행하여 Azure 구독에 배포한 샘플 애플리케이션에 대한 부하를 시뮬레이션할 수 있습니다. 이 자습서에서는 Azure Portal 내에서 부하 테스트를 실행합니다. 또는 부하 테스트를 실행하도록 CI/CD 워크플로를 구성할 수 있습니다.

Azure Portal에서 부하 테스트를 실행하려면 다음을 수행합니다.

  1. Azure Portal에서 Azure Load Testing 리소스로 이동합니다.

  2. 왼쪽 창에서 테스트를 선택하여 부하 테스트 목록을 봅니다.

  3. 목록에서 부하 테스트를 선택하여 테스트 세부 정보 및 테스트 실행 목록을 봅니다.

  4. 실행을 선택한 다음 다시 실행하여 부하 테스트를 시작합니다.

    필요에 따라 테스트 실행 설명을 입력할 수 있습니다.

    Screenshot that shows how to start a load test in the Azure portal.

    부하 테스트를 실행하면 Azure Load Testing은 JMeter 테스트 스크립트 및 모든 추가 파일을 테스트 엔진 인스턴스에 배포한 다음, 부하 테스트를 시작합니다.

  5. 부하 테스트가 시작되면 부하 테스트 대시보드가 표시됩니다.

    대시보드가 표시되지 않으면 새로 고침을 선택한 다음, 목록에서 테스트 실행을 선택할 수 있습니다.

    부하 테스트 대시보드에는 클라이언트 쪽 메트릭 및 서버 쪽 애플리케이션 메트릭과 같은 테스트 실행 세부 정보가 표시됩니다. 대시보드의 그래프가 자동으로 새로 고쳐집니다.

    Screenshot that shows the client-side metrics graphs in the load test dashboard in the Azure portal.

    여러 필터를 적용하거나 결과를 다른 백분위수에 집계하여 차트를 사용자 지정할 수 있습니다.

    언제든지 Azure Portal에서 중지를 선택하여 부하 테스트를 중지할 수 있습니다.

부하 테스트가 완전히 완료될 때까지 기다렸다가 다음 섹션을 진행합니다.

서버 쪽 메트릭을 사용하여 성능 병목 상태 식별

이 섹션에서는 부하 테스트 결과를 분석하여 애플리케이션의 성능 병목 상태를 식별합니다. 클라이언트 쪽 메트릭과 서버 쪽 메트릭을 모두 검사하여 문제의 근본 원인을 확인합니다.

  1. 먼저 클라이언트 쪽 메트릭을 살펴봅니다. addget API 요청에 대한 응답 시간 메트릭의 90번째 백분위수가 lasttimestamp API보다 높습니다.

    Screenshot that shows the client-side metrics.

    lasttimestamp API의 오류가 다른 API보다 적은 비슷한 오류 패턴을 볼 수 있습니다.

    Screenshot that shows the error chart.

    addget API의 결과는 비슷하지만, lasttimestamp API가 다르게 동작합니다. addget API 둘 다 데이터베이스 액세스를 수행하므로 데이터베이스와 관련된 문제일 수 있습니다.

  2. 이 병목 상태를 자세히 조사하려면 서버 쪽 메트릭 대시보드 섹션이 나올 때까지 아래로 스크롤합니다.

    서버 쪽 메트릭은 Azure 애플리케이션 구성 요소인 Azure App Service 요금제, Azure App Service 웹앱 및 Azure Cosmos DB에 대한 구체적인 정보를 보여줍니다.

    Screenshot that shows the Azure App Service plan metrics.

    Azure App Service 요금제에 대한 메트릭에서 CPU 백분율메모리 백분율 메트릭이 허용되는 범위 내에 있는 것을 확인할 수 있습니다.

  3. 이제 Azure Cosmos DB 서버 쪽 메트릭을 살펴봅니다.

    Screenshot that shows Azure Cosmos DB metrics.

    정규화된 RU 소비 메트릭은 데이터베이스가 빠르게 리소스 사용률 100%에 도달한 것을 보여줍니다. 리소스 사용량이 많아서 데이터베이스 제한 오류가 발생했을 수 있습니다. addget 웹 API의 응답 시간이 증가했을 수도 있습니다.

    Azure Cosmos DB 인스턴스의 프로비저닝된 처리량 메트릭 최대 처리량은 400RU인 것을 볼 수 있습니다. 데이터베이스의 프로비저닝된 처리량을 늘리면 성능 문제가 해결될 수도 있습니다.

데이터베이스 처리량 늘리기

이 섹션에서는 성능 병목 상태를 해결하기 위해 데이터베이스에 더 많은 리소스를 할당합니다.

Azure Cosmos DB의 경우 데이터베이스 RU 스케일링 설정을 높입니다.

  1. 샘플 애플리케이션을 배포할 때 프로비저닝한 Azure Cosmos DB 리소스로 이동합니다.

  2. Data Explorer 탭을 선택합니다.

    Screenshot that shows Data Explorer tab.

  3. 크기 조정 및 설정을 선택하고 처리량 값을 1200으로 업데이트합니다.

    Screenshot that shows the updated Azure Cosmos DB scale settings.

  4. 저장을 선택하여 변경 내용을 확인합니다.

성능 향상 유효성 검사

이제 데이터베이스 처리량을 늘렸으므로, 부하 테스트를 다시 실행하고 성능이 개선되었는지 확인합니다.

  1. 테스트 실행 대시보드에서 다시 실행을 선택하고, 테스트 다시 실행 창에서 다시 실행을 선택합니다.

    Screenshot that shows selections for running the load test.

    프로비저닝 중, 실행 중, 완료 상태를 순환하는 상태 열이 있는 새 테스트 실행 항목을 볼 수 있습니다. 언제든지 테스트 실행을 선택하여 부하 테스트가 어떻게 진행되고 있는지 모니터링할 수 있습니다.

  2. 부하 테스트가 완료되면 클라이언트 쪽 메트릭의 응답 시간 결과와 오류 결과를 확인합니다.

  3. Azure Cosmos DB의 서버 쪽 메트릭을 확인하고 성능이 향상되었는지 확인합니다.

    Screenshot that shows the Azure Cosmos DB client-side metrics after update of the scale settings.

    Azure Cosmos DB 정규화된 RU 소비 값은 이제 100% 미만입니다.

데이터베이스의 스케일링 설정을 업데이트했으므로 다음과 같은 결과를 볼 수 있습니다.

  • addget API의 응답 시간이 향상되었습니다.
  • 정규화된 RU 사용량은 여전히 한도 내에 있습니다.

결과적으로 애플리케이션의 전반적인 성능이 향상되었습니다.

리소스 정리

Important

만든 Azure Load Testing 리소스를 다른 Azure Load Testing 자습서 및 방법 문서를 위해 다시 사용할 수 있습니다.

만든 리소스를 사용할 계획이 없다면 추가 요금이 발생하지 않도록 삭제합니다. 다른 리소스 그룹에 샘플 애플리케이션을 배포한 경우 다음 단계를 반복할 수 있습니다.

Azure Portal을 사용하여 리소스를 삭제하려면 다음을 수행합니다.

  1. 왼쪽 상단 모서리에 있는 메뉴 단추를 선택한 다음, 리소스 그룹을 선택합니다.

  2. 목록에서 만든 리소스 그룹을 선택합니다.

  3. 리소스 그룹 삭제를 선택합니다. Screenshot of the selections to delete a resource group in the Azure portal.

  4. 리소스 그룹 이름을 입력합니다. 그런 다음 삭제를 선택합니다.

Azure CLI를 사용하여 리소스를 삭제하려면 다음 명령을 입력합니다.

az group delete --name <yourresourcegroup>

리소스 그룹을 삭제하면 리소스 그룹 내의 모든 리소스가 삭제됩니다.