자습서: 부하 테스트를 실행하여 웹앱에서 성능 병목 상태 식별
이 자습서에서는 Azure Load Testing을 사용하여 웹 애플리케이션에서 성능 병목 상태를 식별하는 방법을 알아봅니다. 샘플 Node.js 애플리케이션에 대한 부하 테스트를 만듭니다.
샘플 애플리케이션은 NoSQL 데이터베이스와 상호 작용하는 Node.js Web API로 구성됩니다. 웹앱을 Azure App Service Azure Cosmos DB를 데이터베이스로 사용하는 웹 API를 배포합니다.
Azure Load Testing의 주요 개념에 대해 자세히 알아봅니다.
이 자습서에서 학습할 방법은 다음과 같습니다.
- 샘플 앱을 배포합니다.
- 부하 테스트를 만들고 실행합니다.
- 앱에서 성능 병목 상태를 식별합니다.
- 병목 상태를 제거합니다.
- 부하 테스트를 다시 실행하여 성능 향상을 확인합니다.
사전 요구 사항
- 활성 구독이 있는 Azure 계정. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
- Azure CLI 버전 2.2.0 이상. 컴퓨터에 설치된 버전을 찾으려면
az --version
을 실행합니다. Azure CLI를 설치하거나 업그레이드해야 하는 경우 Azure CLI 설치 방법을 참조하세요. - Visual Studio Code. 없는 경우 다운로드하여 설치합니다.
- Git. 없는 경우 다운로드하여 설치합니다.
샘플 앱 배포
샘플 앱을 로드하기 전에 배포하고 실행해야 합니다. Azure CLI 명령, Git 명령 및 PowerShell 명령을 사용하여 이러한 작업을 수행합니다.
Windows PowerShell 열고, Azure에 로그인하고, 구독을 설정합니다.
az login az account set --subscription <your-Azure-Subscription-ID>
샘플 애플리케이션의 원본 리포지토리를 복제합니다.
git clone https://github.com/Azure-Samples/nodejs-appsvc-cosmosdb-bottleneck.git
샘플 애플리케이션은 Azure App Service 웹 구성 요소와 Azure Cosmos DB 데이터베이스로 구성된 Node.js 앱입니다. 리포지토리에는 샘플 앱을 Azure 구독에 배포하는 PowerShell 스크립트가 포함되어 있습니다. 이후 단계에서 사용할 Apache JMeter 스크립트도 있습니다.
Node.js 앱의 디렉터리로 이동하여 이 PowerShell 스크립트를 사용하여 샘플 앱을 배포합니다.
cd nodejs-appsvc-cosmosdb-bottleneck .\deploymentscript.ps1
프롬프트에서 다음을 제공합니다.
- Azure 구독 ID.
- 웹앱의 고유한 이름입니다.
- 위치 기본적으로 위치는 입니다
eastus
. Get-AzLocation 명령을 실행하여 지역 코드를 가져올 수 있습니다.
중요
웹앱 이름에 소문자와 숫자만 사용합니다. 공백이나 특수 문자를 사용하지 마세요.
배포가 완료되면 브라우저 창에서 를 열어
https://<yourappname>.azurewebsites.net
실행 중인 샘플 애플리케이션으로 이동합니다.애플리케이션의 구성 요소를 보려면 Azure Portal 로그인하고 만든 리소스 그룹으로 이동합니다.
이제 애플리케이션을 배포하고 실행했으므로 첫 번째 부하 테스트를 실행할 수 있습니다.
부하 테스트 구성 및 만들기
이 섹션에서는 샘플 Apache JMeter 테스트 스크립트를 사용하여 부하 테스트를 만듭니다.
샘플 애플리케이션의 원본 리포지토리에는 SampleApp.jmx라는 Apache JMeter 스크립트가 포함되어 있습니다. 이 스크립트는 각 테스트 반복에서 웹앱에 대한 세 가지 API 호출을 수행합니다.
add
: 웹앱의 방문자 수에 대해 Azure Cosmos DB에서 데이터 삽입 작업을 수행합니다.get
: Azure Cosmos DB에서 GET 작업을 수행하여 개수를 검색합니다.lasttimestamp
: 마지막 사용자가 웹 사이트에 간 이후 타임스탬프를 업데이트.
참고
샘플 Apache JMeter 스크립트에는 및 Throughput Shaping Timer
의 두 플러그 인이 Custom Thread Groups
필요합니다. 로컬 Apache JMeter 인스턴스에서 스크립트를 열려면 두 플러그 인을 모두 설치해야 합니다. Apache JMeter 플러그 인 관리자를 사용하여 이 작업을 수행할 수 있습니다.
Azure 부하 테스트 리소스 만들기
Azure 부하 테스트 리소스는 부하 테스트 작업을 위한 최상위 리소스입니다. 이 리소스는 부하 테스트, 테스트 결과 및 관련 아티팩트를 보고 관리할 수 있는 중앙 집중식 위치를 제공합니다.
부하 테스트 리소스가 이미 있는 경우 이 섹션을 건너뛰고 부하 테스트 만들기를 계속합니다.
Azure 부하 테스트 리소스가 아직 없는 경우 지금 만듭니다.
Azure 구독에 대한 자격 증명을 사용하여 Azure Portal에 로그인합니다.
포털의 왼쪽 위 모서리에 있는 메뉴 단추를 선택한 다음 , + 리소스 만들기를 선택합니다.
검색 창을 사용하여 Azure Load Testing을 찾습니다.
Azure Load Testing을 선택합니다.
Azure Load Testing 창에서 만들기를 선택합니다.
다음 정보를 제공하여 새 Azure Load Testing 리소스를 구성합니다.
필드 Description 구독 이 Azure Load Testing 리소스에 사용할 Azure 구독을 선택합니다. 리소스 그룹 기존 리소스 그룹을 선택합니다. 또는 새로 만들기를 선택한 다음 새 리소스 그룹의 고유한 이름을 입력합니다. 이름 고유한 이름을 입력하여 Azure Load Testing 리소스를 식별합니다.
이름에는 \/""[]:|<>+=;,?*@&또는 공백과 같은 특수 문자를 포함할 수 없습니다. 이름은 밑줄(_)로 시작할 수 없으며 마침표(.) 또는 대시(-)로 끝날 수 없습니다. 길이는 1~64자여야 합니다.위치 Azure Load Testing 리소스를 호스트할 지리적 위치를 선택합니다.
또한 이 위치는 테스트 엔진이 호스트되는 위치와 JMeter 클라이언트 요청의 시작 위치를 결정합니다.참고
필요에 따라 태그 탭에서 자세한 내용을 구성할 수 있습니다 . 태그는 여러 리소스 및 리소스 그룹에 동일한 태그를 적용하여 리소스를 분류하고 통합 청구를 볼 수 있는 이름/값 쌍입니다.
리소스 구성을 완료한 후 검토 + 만들기를 선택합니다.
모든 구성 설정을 검토하고 만들기 를 선택하여 Azure Load Testing 리소스의 배포를 시작합니다.
프로세스가 완료되면 배포 성공 메시지가 나타납니다.
새 리소스를 보려면 리소스로 이동을 선택합니다.
필요에 따라 Azure Load Testing 리소스에 대한 액세스를 관리합니다.
Azure Load Testing은 RBAC(역할 기반 액세스 제어)를 사용하여 리소스에 대한 권한을 관리합니다. 이 메시지가 표시되면 계정에 테스트를 관리하는 데 필요한 권한이 없습니다.
부하 테스트 만들기
다음으로, 샘플 앱에 대한 부하 테스트 리소스에 부하 테스트를 만듭니다. 샘플 앱 리포지토리에서 기존 JMeter 스크립트를 사용하여 부하 테스트를 만듭니다.
부하 테스트 리소스로 이동하고 개요 페이지에서 만들기를 선택합니다.
기본 탭에서 테스트 이름 및 테스트 설명 정보를 입력합니다. 필요에 따라 만든 후 테스트 실행 확인란을 선택하여 부하 테스트를 만든 후 자동으로 시작할 수 있습니다.
테스트 계획 탭에서 JMeter 스크립트 테스트 메서드를 선택한 다음 복제된 샘플 애플리케이션 디렉터리에서 SampleApp.jmx 테스트 스크립트를 선택합니다. 다음으로 업로드 를 선택하여 Azure에 파일을 업로드하고 부하 테스트를 구성합니다.
필요에 따라 추가 Apache JMeter 구성 파일 또는 JMX 파일에서 참조되는 다른 파일을 선택하고 업로드할 수 있습니다. 예를 들어 테스트 스크립트에서 CSV 데이터 세트를 사용하는 경우 해당 .csv 파일을 업로드할 수 있습니다.
매개 변수 탭에서 새 환경 변수를 추가합니다. 이름 및
<yourappname>.azurewebsites.net
값에 웹앱을 입력합니다. 자리 표시자 텍스트를<yourappname>
새로 배포된 샘플 애플리케이션의 이름으로 바꿉 있습니다. 접두사를https://
포함하지 마세요.Apache JMeter 테스트 스크립트는 환경 변수를 사용하여 웹 애플리케이션 URL을 검색합니다. 그런 다음 스크립트는 웹 애플리케이션에서 세 개의 API를 호출합니다.
로드 탭에서 다음 세부 정보를 구성합니다. 이 자습서의 기본값을 그대로 둘 수 있습니다.
설정 값 Description 엔진 인스턴스 1 Apache JMeter 스크립트를 실행하는 병렬 테스트 엔진의 수입니다. 모니터링 탭에서 리소스 메트릭을 사용하여 모니터링할 애플리케이션 구성 요소를 지정합니다. 추가/수정을 선택하여 애플리케이션 구성 요소 목록을 관리합니다.
검토 + 만들기를 선택하고, 모든 설정을 검토하고, 만들기를 선택합니다.
참고
예를 들어 다른 JMX 파일을 업로드하기 위해 언제든지 테스트 구성을 업데이트할 수 있습니다. 테스트 목록에서 테스트를 선택한 다음, 편집을 선택합니다.
Azure Portal 부하 테스트 실행
이 섹션에서는 Azure Portal 사용하여 이전에 만든 부하 테스트를 수동으로 시작합니다. 만든 후 테스트 실행 확인란을 선택한 경우 테스트가 이미 실행되고 있습니다.
테스트를 선택하여 테스트 목록을 확인한 다음, 만든 테스트를 선택합니다.
팁
검색 상자 및 시간 범위 필터를 사용하여 테스트 수를 제한할 수 있습니다.
테스트 세부 정보 페이지에서 실행 또는 테스트 실행을 선택합니다. 그런 다음 테스트 실행 확인 창에서 실행을 선택하여 부하 테스트를 시작합니다.
Azure Load Testing은 대시보드에 애플리케이션의 서버 메트릭을 모니터링하고 표시하기 시작합니다.
테스트가 실행되는 동안 스트리밍 클라이언트 쪽 메트릭을 볼 수 있습니다. 기본적으로 결과는 5초마다 자동으로 새로 고쳐집니다.
여러 필터를 적용하거나 다른 백분위수에 결과를 집계하여 차트를 사용자 지정할 수 있습니다.
팁
중지를 선택하여 Azure Portal 언제든지 부하 테스트를 중지할 수 있습니다.
부하 테스트가 완전히 완료될 때까지 기다렸다가 다음 섹션으로 진행합니다.
성능 병목 상태 식별
이 섹션에서는 부하 테스트 결과를 분석하여 애플리케이션의 성능 병목 상태를 식별합니다. 클라이언트 쪽 및 서버 쪽 메트릭을 모두 검사하여 문제의 근본 원인을 확인합니다.
먼저 클라이언트 쪽 메트릭을 살펴봅니다. 및
get
API 요청에 대한 응답 시간 메트릭add
의 90번째 백분위수는 API보다lasttimestamp
높습니다.API에 다른 API보다 적은 오류가 있는
lasttimestamp
오류에 대해 비슷한 패턴을 볼 수 있습니다.및
get
API의add
결과는 유사하지만 API는lasttimestamp
다르게 동작합니다. 원인은 및 API 모두add
get
데이터베이스 액세스를 포함하기 때문에 데이터베이스와 관련이 있을 수 있습니다.이 병목 상태를 자세히 조사하려면 서버 쪽 메트릭 대시보드 섹션까지 아래로 스크롤합니다.
서버 쪽 메트릭은 azure 애플리케이션 구성 요소에 대한 자세한 정보(Azure App Service 계획, Azure App Service 웹앱 및 Azure Cosmos DB)를 표시합니다.
Azure App Service 계획에 대한 메트릭에서 CPU 백분율 및 메모리 백분율 메트릭이 허용 가능한 범위 내에 있음을 확인할 수 있습니다.
이제 Azure Cosmos DB 서버 쪽 메트릭을 살펴봅니다.
정규화된 RU 소비 메트릭은 데이터베이스가 100% 리소스 사용률로 빠르게 실행되고 있음을 보여줍니다. 리소스 사용량이 많을 경우 데이터베이스 제한 오류가 발생할 수 있습니다. 및
get
웹 API에 대한add
응답 시간이 증가했을 수도 있습니다.Azure Cosmos DB 인스턴스에 대한 프로비전된 처리량 메트릭의 최대 처리량은 400RU임을 확인할 수 있습니다. 데이터베이스의 프로비전된 처리량을 늘리면 성능 문제가 해결될 수 있습니다.
데이터베이스 처리량 늘리기
이 섹션에서는 성능 병목 상태를 해결하기 위해 데이터베이스에 더 많은 리소스를 할당합니다.
Azure Cosmos DB의 경우 데이터베이스 RU 크기 조정 설정을 늘입니다.
샘플 애플리케이션 배포의 일부로 프로비전한 Azure Cosmos DB 리소스로 이동합니다.
Data Explorer 탭을 선택합니다.
크기 조정 & 설정을 선택하고 처리량 값을 1200으로 업데이트합니다.
저장을 선택하여 변경 내용을 확인합니다.
성능 향상 유효성 검사
데이터베이스 처리량을 증가시켰으므로 부하 테스트를 다시 실행하고 성능 결과가 개선되었는지 확인합니다.
테스트 실행 대시보드에서 다시 실행을 선택한 다음, 테스트 다시 실행 창에서 다시 실행을 선택합니다.
프로비전, 실행 및 완료 상태를 순환하는 상태 열이 있는 새 테스트 실행 항목이 표시됩니다. 언제든지 테스트 실행을 선택하여 부하 테스트가 진행되는 방식을 모니터링합니다.
부하 테스트가 완료되면 응답 시간 결과와 클라이언트 쪽 메트릭의 오류 결과를 확인합니다.
Azure Cosmos DB에 대한 서버 쪽 메트릭을 확인하고 성능이 향상되었는지 확인합니다.
Azure Cosmos DB 정규화된 RU 소비 값은 이제 100% 미만입니다.
이제 데이터베이스의 크기 조정 설정을 변경했으므로 다음이 표시됩니다.
- 및
get
API에add
대한 응답 시간이 향상되었습니다. - 정규화된 RU 사용량은 여전히 한도에 미치지 않습니다.
결과적으로 애플리케이션의 전반적인 성능이 향상되었습니다.
리소스 정리
중요
다른 Azure Load Testing 자습서 및 방법 문서에 대해 만든 Azure Load Testing 리소스를 다시 사용할 수 있습니다.
만든 리소스를 사용하지 않으려면 추가 요금이 발생하지 않도록 삭제합니다. 다른 리소스 그룹에 샘플 애플리케이션을 배포한 경우 다음 단계를 반복할 수 있습니다.
Azure Portal 사용하여 리소스를 삭제하려면 다음을 수행합니다.
왼쪽 위 모서리에서 메뉴 단추를 선택한 다음 , 리소스 그룹을 선택합니다.
목록에서 만든 리소스 그룹을 선택합니다.
리소스 그룹 삭제를 선택합니다.
리소스 그룹 이름을 입력합니다. 그런 다음, 삭제를 선택합니다.
Azure CLI를 사용하여 리소스를 삭제하려면 다음 명령을 입력합니다.
az group delete --name <yourresourcegroup>
리소스 그룹을 삭제하면 리소스 그룹 내의 모든 리소스가 삭제됩니다.
다음 단계
다음 자습서로 이동하여 Azure Pipelines 또는 GitHub Actions 사용하여 자동화된 회귀 테스트 워크플로를 설정하는 방법을 알아봅니다.