Azure의 웹앱에 대한 애플리케이션 성능 FAQ
참고 항목
아래 지침 중 일부는 Windows 또는 Linux App Services에서만 작동할 수 있습니다. 예를 들어 Linux App Services는 기본적으로 64비트 모드로 실행됩니다.
이 문서에는 Azure 앱 Service의 Web Apps 기능에 대한 애플리케이션 성능 문제에 대한 FAQ(질문과 대답)가 있습니다.
Azure 문제와 관련된 정보가 이 문서에 없을 경우 MSDN 및 Stack Overflow에서 Azure 포럼을 방문합니다. 이러한 포럼이나 Twitter의 @AzureSupport에 문제를 게시할 수 있습니다. 또한 Azure 지원 요청을 제출할 수 있습니다. 지원 요청을 제출하려면 Azure 지원 페이지에서 지원 받기를 선택합니다.
모든 Web Apps가 중지된 경우에도 App Service 계획에 CPU/메모리 사용량이 표시되는 이유는 무엇인가요?
Azure 앱 Service에는 보안 업데이트, SCM 콘솔의 가용성, 애플리케이션 모니터링, 인증 및 웹앱의 다른 많은 중요한 기능과 같은 여러 플랫폼 작업 및 기능을 처리하는 지속적인 시스템 프로세스가 필요합니다.
실행 중인 Web Apps가 없거나 App Service 계획에 Web Apps가 없는 경우에도 시스템 프로세스가 App Service 계획에서 실행됩니다.
플랫폼 프로세스는 최소한의 리소스(예: CPU, 메모리 및 디스크 공간)를 사용하며 App Service 계획의 용량 계획, 모니터링 및 자동 크기 조정 트리거 구성 중에도 동일하게 고려해야 합니다.
내 앱이 느린 이유는 무엇인가요?
여러 요인으로 인해 앱 성능이 저하될 수 있습니다. 자세한 문제 해결 단계는 느린 웹앱 성능 문제 해결을 참조하세요.
높은 CPU 사용 시나리오 문제를 해결할 어떻게 할까요? 있나요?
CPU 사용량이 많은 일부 시나리오에서는 앱에 실제로 더 많은 컴퓨팅 리소스가 필요할 수 있습니다. 이 경우 애플리케이션이 필요한 모든 리소스를 가져오도록 더 높은 서비스 계층으로 확장하는 것이 좋습니다. 다른 경우에는 CPU 사용량이 높으면 잘못된 루프 또는 코딩 사례로 인해 발생할 수 있습니다. CPU 사용 증가를 트리거하는 항목을 파악하는 프로세스는 두 부분으로 구성됩니다. 먼저 프로세스 덤프를 만든 다음 프로세스 덤프를 분석합니다. 자세한 내용은 Web Apps에 대한 높은 CPU 사용량에 대한 덤프 파일 캡처 및 분석을 참조 하세요.
높은 메모리 사용 시나리오 문제를 해결할 어떻게 할까요? 있나요?
일부 높은 메모리 사용 시나리오에서는 앱에 실제로 더 많은 컴퓨팅 리소스가 필요할 수 있습니다. 이 경우 애플리케이션이 필요한 모든 리소스를 가져오도록 더 높은 서비스 계층으로 확장하는 것이 좋습니다. 코드의 버그로 인해 메모리 누수가 발생할 수 있는 경우도 있습니다. 코딩 방법은 메모리 사용량을 증가시킬 수도 있습니다. 높은 메모리 소비를 트리거하는 요소에 대한 인사이트를 얻는 것은 두 부분으로 구성된 프로세스입니다. 먼저 프로세스 덤프를 만든 다음 프로세스 덤프를 분석합니다. Azure 사이트 확장 갤러리의 크래시 진단기는 이러한 두 단계를 효율적으로 수행할 수 있습니다. 자세한 내용은 Web Apps에 대한 간헐적인 높은 메모리에 대한 덤프 파일 캡처 및 분석을 참조 하세요.
PowerShell을 사용하여 App Service 웹앱을 자동화할 어떻게 할까요? 있나요?
PowerShell cmdlet을 사용하여 App Service 웹앱을 관리하고 유지 관리할 수 있습니다. PowerShell을 사용하여 Azure 앱 Service에서 호스트되는 웹앱 자동화 블로그 게시물에서 Azure Resource Manager 기반 PowerShell cmdlet을 사용하여 일반적인 작업을 자동화하는 방법을 설명합니다. 블로그 게시물에는 다양한 웹앱 관리 작업에 대한 샘플 코드도 있습니다. 모든 App Service 웹앱 cmdlet에 대한 설명 및 구문은 Az.Websites를 참조 하세요.
내 웹앱의 이벤트 로그를 볼 어떻게 할까요? 있나요?
웹앱의 이벤트 로그를 보려면 다음을 수행합니다.
- Kudu 웹 사이트(
https://*yourwebsitename*.scm.azurewebsites.net
)에 로그인합니다. - 메뉴에서 콘솔>CMD 디버그를 선택합니다.
- LogFiles 폴더를 선택합니다.
- 이벤트 로그를 보려면 eventlog.xml 옆에 있는 연필 아이콘을 선택합니다.
- 로그를 다운로드하려면 PowerShell cmdlet
Save-AzureWebSiteLog -Name webappname
을 실행합니다.
내 웹앱의 사용자 모드 메모리 덤프는 어떻게 캡처할 수 있나요?
웹앱의 사용자 모드 메모리 덤프를 캡처하려면:
- Kudu 웹 사이트(
https://*yourwebsitename*.scm.azurewebsites.net
)에 로그인합니다. - 프로세스 탐색기 메뉴를 선택합니다.
- w3wp.exe 프로세스 또는 WebJob 프로세스를 마우스 오른쪽 단추로 클릭합니다.
- 메모리 덤프 전체 덤프> 다운로드를 선택합니다.
내 웹앱에 대한 프로세스 수준 정보를 볼 어떻게 할까요? 있나요?
웹앱에 대한 프로세스 수준 정보를 보는 데는 두 가지 옵션이 있습니다.
- Azure Portal에서 다음을 수행합니다.
- 웹앱에 대한 프로세스 탐색기를 엽니다.
- 세부 정보를 보려면 w3wp.exe 프로세스를 선택합니다.
- Kudu 콘솔에서:
- Kudu 웹 사이트(
https://*yourwebsitename*.scm.azurewebsites.net
)에 로그인합니다. - 프로세스 탐색기 메뉴를 선택합니다.
- w3wp.exe 프로세스에 대한 속성을 선택합니다.
- Kudu 웹 사이트(
내 앱으로 이동하면 "오류 403 - 이 웹앱이 중지되었습니다."가 표시됩니다. 이 문제를 해결할 어떻게 할까요? 있나요?
다음 세 가지 조건으로 인해 이 오류가 발생할 수 있습니다.
- 웹앱이 청구 한도에 도달했으며 사용하지 않도록 설정되었습니다.
- 포털에서 웹앱이 중지되었습니다.
- 웹앱이 무료 또는 공유 확장 서비스 계획에 적용될 수 있는 리소스 할당량 한도에 도달했습니다.
오류의 원인을 확인하고 문제를 해결하려면 Web Apps의 "오류 403 – 이 웹앱이 중지되었습니다"의 단계를 따르세요.
다양한 App Service 계획의 할당량 및 한도에 대한 자세한 내용은 어디서 알아볼 수 있나요?
할당량 및 한도에 대한 자세한 내용은 App Service 한도를 참조하세요.
유휴 시간 후 첫 번째 요청에 대한 응답 시간을 줄일 어떻게 할까요? 있나요?
기본적으로 웹앱은 설정된 기간 동안 유휴 상태이면 언로드됩니다. 이렇게 하면 시스템에서 리소스를 절약할 수 있습니다. 단점은 웹앱이 언로드된 후 첫 번째 요청에 대한 응답이 더 길어 웹앱이 응답을 로드하고 제공하기 시작할 수 있다는 것입니다. 기본 및 표준 서비스 계획에서 Always On 설정을 켜서 앱을 항상 로드할 수 있습니다. 이렇게 하면 앱이 유휴 상태인 후 로드 시간이 길어집니다. 무중단 설정을 변경하려면:
- Azure Portal에서 웹앱으로 이동합니다.
- 구성을 선택합니다.
- 일반 설정을 선택합니다.
- Always On의 경우 켜기(On)를 선택합니다.
실패한 요청 추적을 켤 어떻게 할까요? 있나요?
실패한 요청 추적을 켜려면 다음 단계를 수행합니다.
Azure Portal에서 웹앱으로 이동합니다.
모든 설정>진단 로그를 선택합니다.
실패한 요청 추적의 경우 켜기(On)를 선택합니다.
저장을 선택합니다.
웹앱 블레이드에서 도구를 선택합니다.
Visual Studio Online을 선택합니다.
설정이 켜지지 않은 경우 켜기를 선택합니다.
이동을 선택합니다.
Web.config를 선택합니다.
system.webServer에서 다음 구성을 추가합니다(특정 URL 캡처).
<system.webServer> <tracing> <traceFailedRequests> <remove path="*api*" /> <add path="*api*"> <traceAreas> <add provider="ASP" verbosity="Verbose" /> <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" /> <add provider="ISAPI Extension" verbosity="Verbose" /> <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression, Cache,RequestNotifications,Module,FastCGI" verbosity="Verbose" /> </traceAreas> <failureDefinitions statusCodes="200-999" /> </add> </traceFailedRequests> </tracing>
성능 저하 문제를 해결하려면 이 구성을 추가합니다(캡처 요청이 30초 이상 걸리는 경우).
<system.webServer> <tracing> <traceFailedRequests> <remove path="*" /> <add path="*"> <traceAreas> <add provider="ASP" verbosity="Verbose" /> <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" /> <add provider="ISAPI Extension" verbosity="Verbose" /> <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression, Cache,RequestNotifications,Module,FastCGI" verbosity="Verbose" /> </traceAreas> <failureDefinitions timeTaken="00:00:30" statusCodes="200-999" /> </add> </traceFailedRequests> </tracing>
실패한 요청 추적을 다운로드하려면 포털에서 웹 사이트로 이동합니다.
도구>Kudu>Go를 선택합니다.
메뉴에서 콘솔>CMD 디버그를 선택합니다.
LogFiles 폴더를 선택한 다음 W3SVC로 시작하는 이름의 폴더를 선택합니다.
XML 파일을 보려면 연필 아이콘을 선택합니다.
"작업자 프로세스가 '백분율 메모리' 제한으로 인해 재활용을 요청했습니다."라는 메시지가 표시됩니다. 이 문제를 어떻게 할까요? 해결하시겠습니까?
64비트 운영 체제에서도 32비트 프로세스에 사용 가능한 최대 메모리 양은 2GB입니다. 기본적으로 작업자 프로세스는 App Service에서 32비트(레거시 웹 애플리케이션과의 호환성을 위해)로 설정됩니다.
웹 작업자 역할에서 사용할 수 있는 추가 메모리를 활용할 수 있도록 64비트 프로세스로 전환하는 것이 좋습니다. 이 작업으로 인해 웹앱이 다시 시작되므로 이에 따라 예약합니다.
또한 64비트 환경에는 기본 또는 표준 서비스 계획이 필요합니다. 무료 및 공유 플랜은 항상 32비트 환경에서 실행됩니다.
자세한 내용은 App Service에서 웹앱 구성을 참조 하세요.
230초 후에 요청 시간이 초과된 이유는 무엇인가요?
Azure Load Balancer의 기본 유휴 시간 제한 설정은 4분입니다. 이 설정은 일반적으로 웹 요청에 대한 적절한 응답 시간 제한입니다. 따라서 애플리케이션이 약 240초(Windows 앱의 경우 230초, Linux 앱의 경우 240초) 이내에 응답을 반환하지 않는 경우 App Service는 클라이언트에 시간 제한을 반환합니다. 웹앱에 백그라운드 처리가 필요한 경우 Azure WebJobs를 사용하는 것이 좋습니다. Azure 웹앱은 WebJobs를 호출하고 백그라운드 처리가 완료되면 알림을 받을 수 있습니다. 큐 및 트리거를 포함하여 WebJobs를 사용하기 위한 여러 방법 중에서 선택할 수 있습니다.
WebJobs는 백그라운드 처리를 위해 설계되었습니다. WebJob에서 원하는 만큼 백그라운드 처리를 수행할 수 있습니다. WebJobs에 대한 자세한 내용은 WebJobs를 사용하여 백그라운드 작업 실행을 참조 하세요.
ASP.NET App Service에서 호스트되는 핵심 애플리케이션은 때때로 응답을 중지합니다. 이 문제를 어떻게 해결하나요?
초기 Kestrel 버전에서 알려진 문제로 인해 App Service에서 호스트되는 ASP.NET Core 1.0 앱이 간헐적으로 응답을 중지할 수 있습니다. "지정된 CGI 애플리케이션에 오류가 발생하여 서버가 프로세스를 종료했습니다."라는 메시지가 표시될 수도 있습니다.
이 문제는 Kestrel 버전 1.0.2에서 해결되었습니다. 이 버전은 ASP.NET Core 1.0.3 업데이트에 포함되어 있습니다. 이 문제를 해결하려면 Kestrel 1.0.2를 사용하도록 앱 종속성을 업데이트해야 합니다. 또는 블로그 게시물 ASP.NET Core 1.0 slow perf issues in App Service web apps(App Service Web Apps의 ASP.NET Core 1.0 느린 성능 문제)에 설명된 두 가지 해결 방법 중 하나를 사용할 수 있습니다.
내 웹앱의 파일 구조에서 로그 파일을 찾을 수 없습니다. 어떻게 찾을 수 있나요?
App Service의 로컬 캐시 기능을 사용할 경우 App Service 인스턴스에 대한 LogFiles 및 Data 폴더의 폴더 구조에 영향을 미칩니다. 로컬 캐시를 사용하면 스토리지 LogFiles 및 데이터 폴더에 하위 폴더가 만들어집니다. 하위 폴더는 명명 패턴 "고유 식별자" + 타임스탬프를 사용합니다. 각 하위 폴더는 웹앱이 실행 중이거나 실행된 VM 인스턴스에 해당합니다.
로컬 캐시를 사용하고 있는지 확인하려면 App Service 애플리케이션 설정 탭을 확인합니다. 로컬 캐시를 사용하는 경우 앱 설정 WEBSITE_LOCAL_CACHE_OPTION
이 .로 Always
설정됩니다.
로컬 캐시를 사용하지 않고 이 문제가 발생하는 경우 지원 요청을 제출합니다.
"액세스 권한으로 금지된 방식으로 소켓에 액세스하려고 했습니다."라는 메시지가 표시됩니다. 이 오류를 해결할 어떻게 할까요? 있나요?
이 오류는 일반적으로 VM 인스턴스의 아웃바운드 TCP 연결이 모두 소진된 경우에 발생합니다. App Service에서 각 VM 인스턴스에 대해 수행할 수 있는 아웃바운드 연결의 최대 수에 대한 제한이 적용됩니다. 자세한 내용은 VM 간 숫자 제한을 참조 하세요.
이 오류는 애플리케이션에서 로컬 주소에 액세스하려는 경우에도 발생할 수 있습니다. 자세한 내용은 Local address requests(로컬 주소 요청)를 참조하세요.
웹앱의 아웃바운드 연결에 대한 자세한 내용은 Azure 웹 사이트에 대한 나가는 연결에 대한 블로그 게시물을 참조하세요.
내 App Service 웹앱을 원격 디버그하는 데 Visual Studio를 사용하려면 어떻게 해야 하나요?
Visual Studio를 사용하여 웹앱을 디버그하는 방법을 보여 주는 자세한 연습은 App Service 웹앱 원격 디버그를 참조하세요.
도움을 요청하십시오.
질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.