IIS의 느린 초기로드 수정


129

IIS는 트래픽이 적은 웹 사이트를 위해 성가신 기능을 사용하여 사용하지 않는 작업자 프로세스를 재활용하여 일정 시간이 지난 후 첫 사용자가 사이트에 30 초 이상 지연 될 수 있습니다.

문제에 대한 해결책을 찾고 있는데 이러한 잠재적 해결책을 찾았습니다.

A. 응용 프로그램 초기화 플러그인 사용

B. .NET 4에서 자동 시작 사용

C. 유휴 시간 초과 비활성화 (IIS 재설정에서)

D. 사이트 사전 컴파일

나는 이것들 중 어느 것이 선호되는지 궁금하며, 더 중요한 것은 왜 같은 문제에 대한 해결책이 그렇게 많은가? (제 생각에는 그렇지 않습니다, 나는 무언가를 올바르게 이해하지 못하고 있습니다).

편집하다

C를 수행하는 것만으로도 사이트를 예열 할 수있을 것 같지만 사이트 속도 저하의 실제 원인이 Entity Framework와 관련이 있다는 것을 알았습니다. 참조 질문, 불행히도 대답하지 않은 아직 답을했습니다!

결국 사이트를 빠르게 방문하기 위해 워밍업 스크립트 를 만들어야했습니다.


안녕 친구, C 공연은 충분합니까? 왜 ? 우리는 그것을 사용하거나 재활용을 비활성화해야합니까? 나는 항상 매우 느린 IIS7.5의 두 번째 날 첫 번째 요청을 느낀다
qakmak

답변:


36

옵션 A, B 및 D는 초기 시작 시간에만 영향을 미치기 때문에 동일한 범주에있는 것으로 보입니다. 메모리에서 라이브러리 컴파일 및로드와 같이 웹 사이트를 예열합니다.

C를 사용하여 유휴 시간 초과를 설정하면 서버에 대한 후속 요청이 빠르게 제공 될 수있을 정도로 충분해야합니다 (앱 풀을 다시 시작하는 데 몇 초가 걸립니다).

내가 아는 한, 타임 아웃은 해당 컴퓨터에서 병렬로 실행되는 다른 웹 사이트에 필요한 메모리를 절약하기 위해 존재합니다. 가격은 한 번 느린 로딩 시간입니다.

사용자가 활동하지 않는 경우 앱 풀이 종료된다는 사실 외에도 앱 풀은 기본적으로 1740 분 (29 시간)마다 재활용됩니다.

technet에서 :

인터넷 정보 서비스 (IIS) 응용 프로그램 풀을 주기적으로 재활용하여 불안정한 상태를 방지하여 응용 프로그램 충돌, 중단 또는 메모리 누수로 이어질 수 있습니다.

앱 풀 재활용이 유지되는 한 충분합니다. 그러나 대부분의 구성 요소에서 최고의 성능을 원한다면 언급 한 응용 프로그램 초기화 모듈과 같은 것을 사용해야합니다.


유휴 시간 제한을 비활성화하는 것이 좋습니다? 그로 인해 문제가 발생할 수 있습니까 (이유가 있다고 생각합니다)?
Cavyn VonDeylen

3
이것은 실제로 내 문제를 해결하지는 못하지만 (내 편집 내용 참조) 원래 질문에 답한 이후 수락했습니다.
Cavyn VonDeylen

10

웹 호스팅 도전

많은 회사 (소규모 회사 및 개인)가 공유 서버에서 호스팅하는 경우 사용 가능한 시스템 구성 옵션이 없다는 것을 기억해야합니다.

ASP.NET MVC 오버 헤드

내 사이트가 20 분 이상 방문하지 않고 웹 앱이 중지 된 경우 30 초 이상 걸립니다. 끔찍하다.

성능을 테스트하는 또 다른 방법

ASP.NET MVC 시작인지 아니면 다른 방법인지 테스트하는 다른 방법이 있습니다. 직접 방문 할 수있는 일반적인 HTML 페이지를 사이트에 놓으십시오.
문제가 ASP.NET MVC 시작과 관련이 있으면 웹 앱이 시작되지 않은 경우에도 HTML 페이지가 거의 즉시 렌더링됩니다.
이것이 문제가 ASP.NET MVC 시작에 있다는 것을 처음으로 인식 한 방법입니다. 언제든지 HTML 페이지를로드했는데 빠르게로드됩니다. 그런 다음 해당 HTML 페이지를 방문한 후 ASP.NET MVC URL 중 하나를 치고 "Waiting for raddev.us ..."라는 Chrome 메시지가 표시됩니다.

유용한 스크립트를 사용한 또 다른 테스트

그 후 8 분마다 웹 사이트에 충돌 하는 LINQPad ( 자세한 내용은 http://linqpad.net 확인 ) 스크립트를 작성했습니다 (앱이 언로드되는 시간보다 짧음-20 분이어야 함). 몇 시간 동안 실행됩니다.

스크립트가 실행되는 동안 나는 내 웹 사이트를 쳤고 내 사이트가 엄청나게 빨라졌습니다. 이로 인해 ASP.NET MVC 시작 시간이 느려졌을 가능성이 가장 높습니다.

LinqPad를 다운로드하면 다음 스크립트를 실행할 수 있습니다. URL을 원하는대로 변경하고 실행하면 쉽게 테스트 할 수 있습니다. 행운을 빕니다.

참고 : LinqPad에서는 F4 를 누르고 System.Net에 대한 참조를 추가하여 페이지를 검색 할 라이브러리를 추가해야합니다.

또한 : 엔진이 실행되도록 ASP.NET MVC 사이트에서 경로를로드 할 URL을 가리 키도록 문자열 URL 변수를 변경하십시오.

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}

3

유휴 웹 사이트를 방문하기 위해 핑 서비스 / 스크립트를 작성하는 것은 완전한 제어권을 가지기 때문에 가장 좋은 방법입니다. 전용 호스팅 상자를 임대 한 경우 언급 한 다른 옵션을 사용할 수 있습니다.

공유 호스팅 공간에서 웜업 스크립트는 최상의 1 차 방어입니다 (자체 도움이 가장 좋습니다). 다음은 자신의 웹 응용 프로그램에서 수행하는 방법에 대한 아이디어 를 공유하는 기사입니다 .


누군가가 같은 것을 검색 할 경우를 대비하여이 오래된 스레드를 업데이트했습니다
David Chelliah

2

작업자 프로세스 재활용과 함께 재활용하는 동안 지연이 발생하기 때문에 B를 사용 합니다. 이를 통해 유휴 후 첫 번째 요청에 대한 응답으로 초기화와 관련된 지연을 피할 수 있습니다. 또한 재활용의 이점을 유지할 수 있습니다.


2

일정에 따라 사이트를 핑하는 좋은 방법은 Microsoft Flow를 사용하는 것입니다. 따뜻하게 유지하기 위해 매 시간마다 사이트를 방문하는 흐름을 만드는 것은 매우 쉽습니다. 사이트의 여러 적중을 분리하는 지연으로 단일 플로우를 작성하여 한계를 750으로 조정할 수도 있습니다.

https://flow.microsoft.com


1

성능 문제를 해결하는 방법에 대한 팁은이 기사를 참조하십시오. 여기에는 "콜드 스타트"섹션의 시작과 관련된 두 가지 성능 문제가 포함됩니다. 이 중 대부분은 로컬 또는 프로덕션에서 사용중인 서버 유형에 관계없이 중요합니다.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

응용 프로그램이 XML에서 웹 서비스를 deserialize하는 경우 (웹 서비스 포함) deseriaization에 관련된 모든 바이너리에 대해 SGEN을 실행하고 결과 DLL을 GAC (Global Assembly Cache)에 배치합니다. 이렇게하면 SGEN이 실행 된 어셈블리에서 사용 된 모든 직렬화 개체가 미리 컴파일되어 결과 DLL에 캐시됩니다. 이를 통해 디스크에서 구성 파일을 처음 역 직렬화 (로드)하고 웹 서비스를 처음 호출 할 때 시간을 크게 절약 할 수 있습니다. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

IIS 서버에 인터넷에 대한 나가는 액세스 권한이없는 경우 machine.config에 generatePublisherEvidence =”false”를 추가하여 Authenticode 바이너리에 대한 CRL (Certificate Revocation List) 검사를 해제하십시오. 그렇지 않으면 CRL 목록을 얻기 위해 인터넷에 연결하는 동안 시간이 초과되는 동안 모든 작업자 프로세스가 시작하는 동안 20 초 이상 중단 될 수 있습니다. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

모든 어셈블리에서 NGEN 사용을 고려하십시오. 그러나 신중하게 사용하지 않으면 성능이 크게 향상되지는 않습니다. 각 프로세스에서로드 한 모든 바이너리의 기본로드 주소가 빌드시 겹치지 않도록 신중하게 설정해야하기 때문입니다. 주소 충돌로 인해 바이너리를로드 할 때 바이너리를 리베이스해야하는 경우 NGEN을 사용하면 거의 모든 성능 이점이 손실됩니다. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx


0

4 분 동안 활동이 없으면 첫 요청에서 일관된 15 초 지연이 발생했습니다. 내 문제는 내 응용 프로그램이 SQL Server에 Windows 통합 인증을 사용하고 있으며 서비스 프로필이 서버와 다른 도메인에 있다는 것입니다. 이로 인해 앱 초기화시 IIS에서 SQL로 도메인 간 인증이 발생했습니다. 이것이 지연의 실제 원인이었습니다. Windows 인증 대신 SQL 로그인을 사용하기로 변경했습니다. 지연은 즉시 사라졌습니다. 나는 여전히 성능 향상을 돕기 위해 모든 앱 초기화 설정을 가지고 있지만 내 경우에는 전혀 필요하지 않을 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.