연습 - 수동으로 웹앱 규모 조정

완료됨

트래픽이 증가할 것으로 예상되면 시스템을 규모 확장해야 합니다. 성능의 감소에 대응하여 규모 확장할 수도 있습니다.

호텔 예약 시스템 예의 경우 특별 행사, 특별 이벤트 또는 계절적 변동으로 인해 트래픽이 추가로 발생할 것으로 예상되면 웹앱의 인스턴스 수를 늘립니다. 수요가 감소되면 시스템의 크기를 다시 조정할 수 있습니다.

이 연습에서는 App Service 요금제를 만들고, 이 계획을 사용하여 웹앱을 배포합니다. 로드 중인 웹앱의 성능을 모니터링합니다. 그런 다음 앱을 스케일 아웃하고 계획에 따라 앱 성능이 개선되었는지 확인합니다.

이 연습에서는 웹 API를 구현하는 웹앱 샘플을 사용합니다. 웹 API는 호텔 예약 웹 사이트에 대한 고객의 예약을 만들고 검색하는 HTTP POST 및 GET 작업을 공개합니다. 예약이 저장되지 않습니다. GET 작업은 단순히 더미 데이터를 검색합니다.

또한 이 연습에서는 몇 명의 사용자가 POST 및 GET 작업을 동시에 실행하는 상황을 시뮬레이션하는 클라이언트 앱도 실행합니다. 이 앱은 크기 조정 전후에 웹앱의 성능을 테스트하는 데 사용하는 워크로드를 제공합니다.

App Service 계획 및 웹앱 만들기

중요

이 연습을 수행하려면 사용자의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

  1. Azure Portal에 로그인합니다.

  2. Azure Portal 메뉴 또는 페이지에서 리소스 만들기를 선택합니다. 리소스 만들기 창이 나타납니다.

  3. 왼쪽 메뉴 창의 범주에서 을 선택하고 웹앱을 검색하여 선택한 다음 만들기를 선택합니다. 웹앱 만들기 창이 나타납니다.

  4. 기본 탭에서 각 설정에 다음 값을 입력합니다.

    참고

    웹앱의 이름은 고유해야 합니다. <이름 또는 이니셜>hotelsystem과 같은 이름을 사용하는 것이 좋습니다. 이 연습에서 <your-webapp-name>이 표시되는 위치에는 모두 이 이름을 사용하세요.

    설정
    프로젝트 세부 정보
    구독 이 연습에 사용할 Azure 구독을 선택합니다.
    리소스 그룹 새로 만들기 링크를 선택하고 mslearn-scale이라는 새 리소스 그룹을 입력합니다.
    인스턴스 세부 정보
    이름 표 앞의 참고 사항을 참조하세요. 이 연습의 뒷부분에서 기억할 수 있는 고유한 이름을 입력합니다.
    게시 코드
    런타임 스택 .NET 6(LTS)
    운영 체제 Windows
    지역 기본값 적용
    App Service 계획
    Windows 플랜 기본값 적용
    요금제 기본값 적용
  5. 검토 + 만들기>만들기를 차례로 선택합니다. 웹앱이 생성 및 배포되기를 기다립니다.

웹앱 빌드 및 배포

  1. Azure 작업 표시줄에서 ‘Cloud Shell’ 아이콘을 선택하여 Azure Cloud Shell을 열고 다음 명령을 실행하여 호텔 예약 시스템의 소스 코드를 다운로드합니다.

    작업 표시줄의 Cloud Shell 아이콘 스크린샷

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  2. mslearn-hotel-reservation-system/src 폴더로 이동합니다.

    cd mslearn-hotel-reservation-system/src
    
  3. 호텔 시스템용 앱을 빌드합니다. 앱에는 시스템용 웹 API를 구현하는 웹앱과, 웹앱 부하 테스트에 사용하는 클라이언트 앱으로 총 두 가지가 있습니다.

    dotnet build
    
  4. 게시할 HotelReservationSystem 웹앱을 준비합니다.

    cd HotelReservationSystem
    dotnet publish -o website
    
  5. 게시된 파일이 있는 website 폴더로 이동합니다. 파일을 압축하여 이전 작업에서 만든 웹앱에 배포합니다. 메모장에 다음 코드를 복사하여 <your-webapp-name>을 웹앱 이름으로 바꾼 다음, 편집된 코드 블록을 Cloud Shell에 붙여넣고 실행합니다.

    cd website
    zip website.zip *
    az webapp deploy --src-path website.zip --name <your-webapp-name> --resource-group mslearn-scale
    
  6. 웹 브라우저를 사용하여 http://<your-webapp-name>.azurewebsites.net/api/reservations/1로 이동합니다. 예약 번호 1에 대한 세부 정보가 포함된 JSON 문서가 나타납니다.

    실행 중인 웹앱에서 JSON 형식의 예약 번호 1에 대한 세부 정보를 보여 주는 스크린샷.

규모 확장 전의 웹앱 성능 모니터링

  1. Cloud Shell로 돌아가서 ~/mslearn-hotel-reservation-system/src/HotelReservationSystemTestClient 폴더로 이동합니다.

    cd ~/mslearn-hotel-reservation-system/src/HotelReservationSystemTestClient
    
  2. 코드 편집기를 사용하여 이 폴더의 App.config 파일을 편집합니다.

    code App.config
    
  3. ReservationsServiceURI를 지정한 줄의 주석 처리를 제거하고 웹 사이트 이름 값을 웹앱의 이름으로 바꿉니다. 파일은 다음 예와 같이 표시됩니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="NumClients" value="100" />
            <add key="ReservationsServiceURI" value="https://<your-webapp-name>.azurewebsites.net/" />
            <add key="ReservationsServiceCollection" value="api/reservations" />
        </appSettings>
    </configuration>
    

    참고

    이 파일의 NumClients 설정은 동시에 웹앱에 연결을 시도하여 작업을 수행할 수 있는 클라이언트의 수를 지정합니다. 이 작업은 예약을 만든 다음 쿼리를 실행하여 예약 세부 정보를 가져옵니다. 사용된 데이터는 모두 가짜이며, 어느 곳에서도 유지되지 않습니다. 이 값을 100으로 설정한 채로 두세요.

  4. Ctrl+S를 선택하여 파일을 저장합니다.

  5. 코드 편집기를 사용하여 이 폴더의 HotelReservationSystemTestClient.csproj 파일을 편집합니다.

    code HotelReservationSystemTestClient.csproj
    
  6. 웹앱에 대해 선택한 런타임 스택과 일치하도록 TargetFramework를 지정하는 줄을 편집합니다. TargetFramework 값을 netcoreapp7.0으로 변경합니다. 파일은 다음 예와 같이 표시됩니다.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp7.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
        <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0" />
      </ItemGroup>
    
      <ItemGroup>
        <ProjectReference Include="..\HotelReservationSystemTypes\HotelReservationSystemTypes.csproj" />
      </ItemGroup>
    
    </Project>
    
  7. Ctrl+S를 선택하여 파일을 저장하고 Ctrl+Q를 눌러 코드 편집기를 닫습니다.

  8. 새 구성으로 테스트 클라이언트 앱을 다시 빌드합니다.

    dotnet build
    
  9. 클라이언트 앱을 실행합니다. 클라이언트가 실행되기 시작하고, 예약을 수행하고, 쿼리를 실행하면서 몇 가지 메시지가 표시됩니다. 시스템을 몇 분 동안 실행합니다. 응답 속도가 느려지고 곧 HTTP 408(시간 제한) 오류로 인해 클라이언트 요청이 실패합니다.

    dotnet run
    

    실행 중인 클라이언트 앱에서 발생하는 응답과 오류 메시지를 보여 주는 스크린샷.

  10. Azure Portal에서 리소스로 이동을 선택하여 웹앱을 엽니다.

  11. 왼쪽 메뉴 창에서 모니터링, 메트릭,을 차례로 선택합니다.

  12. 웹앱 창의 메뉴 모음 오른쪽에서 현지 시간: 지난 24시간(자동) 시간 범위를 선택한 다음, 지난 30분을 선택하고 적용을 선택합니다.

  13. 창의 차트 제목에서 차트에 다음 메트릭을 추가합니다.

    • 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 CPU 시간을 선택합니다. 집계합계를 선택합니다.
    • 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 HTTP 서버 오류를 선택합니다. 집계합계를 선택합니다.
    • 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 HTTP 4xx를 선택합니다. 집계합계를 선택합니다.
    • 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 응답 시간을 선택합니다. 집계에서 평균을 선택합니다.
  14. 오른쪽 메뉴 모음에서 대시보드에 고정을 선택합니다. 대시보드에 고정 창이 나타납니다. 새로 만들기 탭을 선택합니다.

  15. 대시보드 이름 드롭다운 목록에서 웹앱 이름을 입력한 다음 만들기 및 고정을 선택합니다.

  16. 시스템이 안정될 때까지 5분 동안 실행한 다음 CPU 시간, HTTP 4xx 오류 수 및 평균 응답 시간을 적어둡니다. 상당한 수의 HTTP 4xx 오류가 표시되어야 합니다. 이러한 오류는 HTTP 408 시간 제한 오류입니다. 평균 응답 시간은 몇 초입니다. 웹 서버에서 부하를 처리하는 방법에 따라 때때로 HTTP 서버 오류가 발생할 수 있습니다.

    규모 확장 이전의 웹앱에 대한 성능 메트릭을 보여 주는 스크린샷

  17. 다음 작업을 수행하는 동안 클라이언트 앱이 실행되도록 둡니다.

웹앱 규모 확장 및 성능 향상 확인

  1. Azure Portal에서 웹앱 이름(App Service)을 선택하고 왼쪽 메뉴 창의 설정에서 스케일 아웃(App Service 요금제)을 선택합니다. 스케일 아웃(App Service 요금제) 창이 나타납니다.

  2. 구성 탭에서 수동 스케일링을 선택하고 인스턴스 수5롤 설정합니다. 저장을 선택합니다.

    5개 인스턴스로 규모 확장하는 App Service 계획에 대한 구성 페이지의 스크린샷

  3. 클라이언트 앱을 실행하고 있는 Cloud Shell로 전환합니다. 일부 요청은 여전히 시간 초과되지만 오류로 인해 실패하는 요청이 더 적어야 합니다.

  4. 또 다시 앱을 5분 동안 실행합니다. 다음으로, Azure Portal의 대시보드에서 앱에 대한 메트릭을 보여 주는 차트로 이동합니다. 이제 사용 가능한 CPU 성능이 5배 이상 높아졌으므로 CPU 시간이 상당히 증가했음을 알 수 있습니다. 평균 응답 시간이 줄고 HTTP 4xx 오류의 수도 감소됩니다. 다음 차트에서는 일반적인 결과 집합을 보여 줍니다. 규모 확장이 발생한 지점이 강조 표시되어 있습니다.

    5개의 인스턴스로 규모 확장한 이후의 웹앱에 대한 성능 메트릭을 보여 주는 스크린샷

  5. 조금 더 실험하려는 경우 App Service 계획의 인스턴스 수를 10개로 늘려보세요. S1 계층에서 지원되는 최대 인스턴스 수는 10입니다. CPU 시간이 추가로 증가하고 이에 따라 응답 시간과 HTTP 4xx 오류가 감소한다는 것을 알 수 있습니다.

  6. 클라이언트 앱을 실행하고 있는 Cloud Shell로 돌아갑니다. Enter 키를 선택하여 앱을 중지합니다.

  7. Azure Portal에서 인스턴스 수를 다시 1로 설정합니다. 웹앱을 선택하고 왼쪽 메뉴 창에서 스케일 아웃(App Service 요금제)을 선택합니다. 구성 탭에서 인스턴스 수를 1로 설정하고 저장을 선택합니다.