source

IIS의 느린 초기 로드 수정

itover 2023. 4. 22. 09:20
반응형

IIS의 느린 초기 로드 수정

IIS에는 사용되지 않는 워커 프로세스를 재활용하는 트래픽량이 적은 웹 사이트용 귀찮은 기능이 있습니다.이 기능을 통해 사이트에 처음 접속한 사용자는 시간이 지나면 매우 긴 지연(30초 이상)을 얻을 수 있습니다.

저는 그 문제에 대한 해결책을 찾고 있었고, 잠재적인 해결책을 찾았습니다.

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

B. 에서 자동 시작을 사용합니다.넷 4

C. 아이돌 타임아웃을 무효로 합니다(IIS Reset).

D. 사이트를 미리 컴파일합니다.

다음 중 어떤 것이 더 좋은지 궁금한데, 더 중요한 것은 왜 같은 문제에 대해 이렇게 많은 해결책이 있는가 하는 것입니다.(제 추측으로는 그렇지 않습니다.제가 제대로 이해하지 못하고 있을 뿐입니다).

편집

C를 실행하는 것으로는 사이트를 따뜻하게 유지하기에 충분할 것 같습니다만, 사이트 속도가 느린 진짜 원인은 엔티티 프레임워크에 있다는 것을 알게 되었습니다.이거는 왜 콜드 상태가 되었는지 알 수 없습니다.아쉽게도 아직 답이 나오지 않은 이 질문을 보십시오!

저는 결국 사이트를 빠르게 유지하기 위해 가끔 방문하기 위해 준비 대본을 작성해야 했습니다.

옵션 A, B, D는 초기 시작 시간에만 영향을 미치기 때문에 같은 카테고리에 있는 것 같습니다.이것들은 메모리 내의 라이브러리 컴파일 및 로드와 같은 웹사이트 워밍업을 합니다.

C를 사용하여 아이돌타임아웃을 설정하면 서버에 대한 후속 요청을 신속하게 처리할 수 있습니다(애플리케이션 풀을 재시작하는 데는 몇 초 정도 시간이 걸립니다).

내가 알기로는 타임아웃은 그 기계에서 병렬로 실행되고 있는 다른 웹사이트에서 필요로 하는 메모리를 절약하기 위해 존재하는 것으로 알고 있습니다.가격은 한때 로딩 시간이 느리다는 것입니다.

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

technet에서:

Internet Information Services(IIS; 인터넷 정보 서비스) 응용 프로그램 풀을 정기적으로 재활용하여 응용 프로그램의 크래시, 행업 또는 메모리 누수의 원인이 될 수 있는 불안정한 상태를 방지할 수 있습니다.

앱 풀의 재활용이 유효하게 되어 있는 한, 이것으로 충분합니다.그러나 대부분의 컴포넌트에서 최고 수준의 퍼포먼스를 원한다면 앞서 언급한 Application Initialization Module과 같은 것을 사용해야 합니다.

웹 호스팅 과제

많은 기업(소규모 기업 및 개인)과 마찬가지로 공유 서버에서 호스팅되는 경우 사용할 수 있는 머신 구성 옵션은 없다는 점을 기억해야 합니다.

ASP.NET MVC 오버헤드

내 사이트는 20분이 넘도록 접속되지 않으면 최소 30초 이상 걸립니다(웹 앱이 정지되어 있습니다).끔직하다.

퍼포먼스를 테스트하는 다른 방법

ASP인지 아닌지를 테스트하는 다른 방법이 있습니다.NET MVC の net net 。직접 누를 수 있는 일반 HTML 페이지를 사이트에 놓습니다.
ASP.NET MVC가 부팅되면 웹 앱이 시작되지 않은 경우에도 HTML 페이지가 거의 즉시 렌더링됩니다.
그래서 ASP에 문제가 있다는 것을 처음 깨달았습니다.NET MVC 됩니다.HTML 페이지를 언제든지 로드하면 순식간에 로딩이 됩니다.HTML의 ASP입니다.NET MVC URL "Waiting for raddev.us..."

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

그 후, 8분마다(앱의 언로드 시간은 20분 미만) 제 웹사이트에 접속하는 LINQPad(자세한 내용은 http://linqpad.net를 참조해 주세요) 스크립트를 작성하고, 몇 시간 동안 실행하도록 했습니다.

스크립트가 실행되는 동안 나는 내 웹사이트를 방문했고 매번 내 사이트가 엄청나게 빨리 떴다.이것은 제가 경험하고 있는 속도가 ASP에 의한 것이었음을 잘 알 수 있습니다.NET MVC 시작 시간

LinqPad를 입수하면 다음 스크립트를 실행할 수 있습니다.URL을 자신의 것으로 변경하고 실행시키면 간단하게 테스트할 수 있습니다.행운을 빌어요.

메모: LinqPad에서는 F4 키를 눌러 시스템에 대한 참조를 추가해야 합니다.[Net] : 페이지를 검색할 라이브러리를 추가합니다.

또한 : String URL 변수를 ASP에서 루트를 로드하는 URL을 가리키도록 변경해야 합니다.엔진이 가동되도록 NET MVC 사이트

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";
    }
}

ping 서비스/스크립트를 작성하여 아이돌 상태의 웹사이트에 접속하는 것은 완전한 제어가 가능하기 때문에 최선의 방법입니다.전용 호스팅 박스를 임대한 경우 말씀하신 다른 옵션을 사용할 수 있습니다.

공유 호스팅 공간에서는 워밍업 스크립트가 최선의 1차 방어입니다(셀프 도움말은 최고의 도움말입니다).여기 당신의 웹 어플리케이션에서 그것을 하는 방법에 대한 아이디어를 공유하는 기사가 있습니다.

작업자 공정 재활용과 연계하면 재활용하는 동안 지연만 발생하므로 B로 하겠습니다.이렇게 하면 아이돌 후 첫 번째 요구에 대한 응답으로 일반적으로 초기화와 관련된 지연을 피할 수 있습니다.재활용의 혜택도 계속 누릴 수 있습니다.

스케줄에 따라 사이트에 ping을 실행하는 좋은 옵션은 Microsoft Flow를 사용하는 것입니다.Microsoft Flow는 매월 최대 750회의 "실행"이 무료입니다.사이트를 따뜻하게 유지하기 위해 매 시간마다 사이트를 덮치는 플로우를 만드는 것은 매우 쉽습니다.사이트의 여러 히트를 분리하는 지연을 수반하는 단일 플로우를 생성함으로써 750이라는 제한을 회피할 수도 있습니다.

https://flow.microsoft.com

퍼포먼스 문제에 도움이 되는 힌트는, 이 기사를 참조해 주세요.여기에는 "콜드 스타트" 섹션의 부팅과 관련된 두 가지 성능 문제가 포함됩니다.이 대부분은 로컬에서 사용 중이든 실제 가동 중이든 어떤 유형의 서버를 사용 중이든 상관없습니다.

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

응용 프로그램이 XML에서 어떤 것을 역직렬화하는 경우(Web 서비스도 포함)에는 반드시 SGEN이 역직렬화에 관련된 모든 바이너리에 대해 실행되고 그 결과 생성된 DLL을 Global Assembly Cache(GAC; 글로벌어셈블리 캐시)에 배치해야 합니다.이렇게 하면 SGEN이 실행된 어셈블리에 의해 사용된 모든 시리얼라이제이션오브젝트가 사전에 컴파일되어 결과 DLL에 캐시됩니다.이것에 의해, 디스크로부터 설정 파일의 최초의 역직렬화(로드)와 Web 서비스에의 초기 콜에 걸리는 시간을 큰폭으로 단축할 수 있습니다.http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

인터넷에 대한 발신 액세스 권한이 없는 IIS 서버가 있는 경우 generatePublisherEvidence="false"를 machine.config에 추가하여 CRL(인증서 해지 목록)을 해제하십시오.그렇지 않으면 모든 워커의 프로세스가 기동 중에 20초 이상 정지하고 인터넷에 접속하여 CRL 목록을 취득하려고 할 때 타임아웃이 발생할 수 있습니다.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

4분간의 무활동으로 첫 번째 요청에서 15초 지연이 발생하였습니다.문제는 내 앱이 SQL Server에 대한 Windows 통합 인증을 사용하고 있고 서비스 프로파일이 서버와 다른 도메인에 있다는 것이었습니다.이로 인해 앱 초기화 시 IIS에서 SQL로 교차 도메인 인증이 이루어졌고 이것이 지연의 진짜 원인이었습니다.Windows 인증 대신 SQL 로그인을 사용하는 것으로 변경했습니다.지연은 즉시 해소되었다.성능 향상을 위해 앱 초기화 설정을 모두 갖추고 있지만, 제 경우에는 전혀 필요하지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/13386471/fixing-slow-initial-load-for-iis

반응형