2017-12-20 18 views
1

현재 ASP.NET MVC4 응용 프로그램을 Microsoft Azure에 배포 한 후 매우 성가신 성능 문제가 있습니다. 앱을 다시 시작한 직후 (또는 몇 분 동안 사용하지 않으면) 일부 페이지는 처음으로로드하는 데 약 15 초가 걸립니다. 이 후에 클라이언트 측 캐시를 지울 때도 페이지가 약 2 초 안에로드됩니다 (여전히 개선이 필요하지만 15 초보다 좋은 방법입니다). 여기 ASP.NET MVC4 페이지가 Microsoft Azure에서 매우 느리게 로딩 됨

는 이미 지금까지 시도했습니다 내용은 다음과 같습니다

  • 내가 더미 코드
  • (가)에 제작 설정을 변경하여 데이터베이스 관련 코드를 대체하기 위해 Global.asax에있는 모든 이벤트를 통해 빗질 : «프리 D는 게시시»를 (가격 책정 계층 내 응용 프로그램이«건강한»간주됩니다«에 항상»
  • 이 포털의 응용 프로그램 설정에서 활성화 하늘빛의«응용 프로그램 성능 분석»에 따르면
  • 을 (하나의 어셈블리에 모든 출력을 병합) B1 [기본, 1 코어, 1 .75GB RAM] 따라서 always-on-switch는 공유 런타임 구성에 의해 무시되지 않는다고 가정합니다.

위의 글 머리 기호 중 아무 것도 내 문제를 해결하지 않았기 때문에 keppalive-Job 정기적으로이 같은 웹 사이트에 요청 Quartz.NET 사용 : 내 경우에는 (

new System.Net.WebClient().OpenRead("https://foo.azurewebsites.net");

을, 나는 효과가 here 언급 한 바와 같이의 Web.config 내 initializationPages을 선언하는 등 더 많거나 적은 동일합니다 생각하지 않습니다 그것?)

결과 : 작동하지만이 URL에만 적용됩니다. 모든 가능한 경로의 목록을 확실히 유지하는 것은 갈 길이 아닙니다.

이 문제를 해결해 봤습니까? 나는 당신의 의견을 높이 평가할 것입니다!

답변

2

하늘빛을 호스트하는 조직에서 근무한 지 얼마 안되었지만 사실상 유휴 시간 제한을 0으로 설정하는 것과 동일하게 "항상 켜기"라는 레이블을 구성 할 수있는 옵션이있었습니다 응용 프로그램 풀에 저장하고 응용 프로그램을 메모리에로드 된 상태로 유지하십시오. 트래픽없이 OTHriwise를 실행하면 사이트가 언로드되고 첫 번째 히트시 JIT를 수행하게됩니다 (처음 배포 한 후와 같이).

"항상 켜기"옵션을 제공하지 않는 저가형 계층에 가입했을 때 트래픽을 계속 늘리고 메모리에서 언로드되는 것을 방지하기 위해 사이트에 모의 http 요청을 만드는 다른 사용자에 대해 읽었습니다.

편집 : 여기에 또 다른 SO를 해결 게시 : 내가 마지막으로이 문제를 처리하는 방법을 자세히 설명하고 싶었 허용 대답에 추가 App pool timeout for azure web sites

+0

입력 해 주셔서 감사합니다. 언급하는 것을 잊어 버렸습니다. 앱의 가격 책정 등급은 B1 (무료 또는 공유 계획이 아님)입니다. 따라서이 경우 항상 켜기 옵션은 예상 한대로 작동해야한다고 생각합니다. 그렇지 않니? 나는 그 질문을 갱신 할 것이다. HTTP 요청을 조롱하는 것은 내가 피하려고 시도한 것입니다. 이는 URL의 목록을 유지한다는 것을 의미하기 때문입니다. – Alan

+0

@Alan ... 답변입니다. 나는 당신의 상황에 정확히 그것을 사용한다. –

+0

우리는 JIT 컴파일러가 워밍업을하도록 강제하기 위해 각 페이지에 대한 HTTP 요청을 조롱 할 수없는 것처럼 보일 수있다. :) 나는 내가 최종적으로 자신에게 만족 한 해결책을 자세하게 설명하기 위해 새로운 대답을 게시 할 것이다. 그러나 나는 올바른 방향으로 나를 인도 해주기 때문에이 대답을 받아 들일 것입니다. Travis & Big Daddy! +1 – Alan

0

. 아마 이것은 미래에 다른 사람을 도울 수 있습니다. 중요한 사이트의 웹 요청을 트리거링하여 시작시 응용 프로그램을 예열 할 수있는 코드를 작성했습니다 (모든 단일 페이지에 대해 수행해야 할 경험을 만들었습니다. 루트 주소를 워밍업하면 충분하지 않습니다) . 앱에 따라서 페이지를 요청할 때 무서운 성능을 경험하는 사용자를 방지, 배포 후/시작할 때

private void WarmUp() 
{ 
    var baseUrl = "https://foo.azurewebsites.net"; 

    /** 
    * Requests to protected pages need to be authenticated and authorized, otherwise the JIT-Compile won't work 
    * For ASP.NET apps that are using FormsAuthentication just send a POST-request as you normally would do using a html form, 
    * then grab the cookie you get in the response and pass it to the subsequent requests 
    * */ 
    var email = "[email protected]"; 
    var password = "verysecure"; 
    var cookies = new CookieContainer(); 

    var webRequest = WebRequest.Create($"{baseUrl}/Account/Login") as HttpWebRequest; 
    webRequest.Method = "POST"; 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.CookieContainer = cookies; 

    var requestWriter = new StreamWriter(webRequest.GetRequestStream()); 
    requestWriter.Write($"user={email}&password={password}");//Small example for brevity. Don't forget to extract the requestVerificationToken in production :-) 
    requestWriter.Close(); 
    webRequest.GetResponse().Close(); 

    var urls = new[] { 
    baseUrl, 
    $"{baseUrl}/Home/Contact", 
    $"{baseUrl}/Protected/Stuff", 
    //... 
    }; 
    foreach (var url in urls)//trigger web-requests 
    { 
    webRequest = WebRequest.Create(url) as HttpWebRequest; 
    webRequest.CookieContainer = cookies; 
    webRequest.GetResponse().Close(); 
    } 
} 

이 우리를 위해 많은 시간이 소요되는 JIT-물건을 트리거합니다.앱의 가격 책정 계획이 S1 이상이면 deployment slots을 사용하면 더 많은 실적을 개선 할 수 있습니다. 프로덕션 환경에 배포하기 전에도 애플리케이션을 워밍업 할 수 있습니다.

내 경우 (예약 가격 책정 수준 B1), Application_Start 내에서 코드를 한 번 실행하면 충분하다고 생각합니다. 왜냐하면«항상 켜기»는 내 앱의 작업자 프로세스가 사이트가 자동으로 종료되지 않도록해야하기 때문입니다. 일정 기간 동안 아무런 트래픽도 얻지 못합니다 (공유 리소스로 앱을 실행중인 경우 Cron 작업 또는 이와 유사한 앱을 사용하여 앱을 계속 실행하십시오).