다시 시작할 때마다 로컬 .NET 사이트를 처음로드하는 데 시간이 걸리는 이유는 무엇입니까? [닫은]


27

.NET 플랫폼을 기반으로 사이트를 개발 중입니다. 일반적으로 이러한 사이트를 로컬 IIS에 배포하여 사이트를 시작하기 전에 테스트하고 해당 기능을 볼 수 있습니다. 그러나 창을 다시 시작할 때마다 사이트를 처음 실행하는 데 시간이 오래 걸리는 것 같습니다.

나는 JIT에 대해 알고 있으며이 질문 도 알고 있지만 내 질문에 대답하지는 않습니다.

윈도우를 다시 시작할 때마다 JIT가 발생합니까? w3wp.exe 프로세스 생성과 관련이 있습니까? 다시 시작할 때마다 첫 번째 요청에 대해 사이트가 너무 느린 이유는 무엇입니까?


3
이것을 "콜드 스타트"라고합니다. 시스템은 w3wp를 메모리에로드해야합니다. 여기에는 RAM 관련 파일이 아니기 때문에 JIT, 프로세스 가져 오기 테이블, 디스크에서 데이터 읽기 등 모든 관련 DLL이 필요합니다.
Coder

귀하의 의견에 @Coder, +1. 그러나 나와 다른 개발자가 혜택을 사용할 수 있도록 답변을 통해 더 자세히 설명해 주시겠습니까? :)
Saeed Neamati

IIS는 저의 전문 분야가 아니므로 누군가가 더 나은 답변을 드릴 수 있기를 바랍니다. 여기 내가 전에 시작한 비슷한 주제가 있습니다. stackoverflow.com/questions/3807791/cold-startup-optimization 어쩌면 더 도움이 될 것입니다.
Coder

4
이 질문은 개념적인 프로그래밍 문제가 아니라 구현 문제에 관한 것이므로 주제가 아닌 것 같습니다.

답변:


32

이 문제는 JIT 컴파일입니다. 애플리케이션 풀은 라이브러리를 빌드하기 전에 라이브러리를 빌드 할 시간이 필요합니다. 워밍업 스크립트를 사용하여 속도를 높일 수 있지만 반드시 발생해야합니다. 또한 웹 사이트를 사용하는지 웹 응용 프로그램 프로젝트를 사용하는지에 따라 다릅니다. 웹 사이트는 모든 페이지에 대해 JIT이므로 첫 번째 적중은 느리고 새로운 각 페이지 적중에는 추가 컴파일 시간이 있습니다. 웹 응용 프로그램 프로젝트는 미리 컴파일되어 있으므로이 히트가 심하게 발생하지는 않지만 라이브러리를 계속로드해야합니다. 라이브러리 / 도구가 많을수록이 히트는 더 심해집니다. 예열에 대해 설명하는 링크는 다음과 같습니다.

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx https://stackoverflow.com/questions/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm 스크립트 /


6
이것은 대부분 정확하지만이 답변에서 명확하지 않은 컴파일과 지팅의 차이점이 있습니다. Jitting은 .NET 바이트 코드를 기계 코드로 컴파일합니다. ASP.NET은 실제로 웹 응용 프로그램 프로젝트에서도 aspnet_compiler를 사용하지 않는 한 해당 웹 페이지를 컴파일 합니다. 컴파일 / 빌드 시간 지팅 및 라이브러리로드 시간이 모두 느린 이유입니다.
Aaronaught

JIT는 적시를 의미합니다. 컴파일되는 코드의 시간과 양을 넘어서 "지팅"과 "컴파일"사이에는 차이가 없습니다. 또한 JIT 컴파일은 각 방문 페이지가 아닌 방문하지 않은코드에 대해서만 발생 합니다. 예를 들어 동일한 템플릿을 사용하는 경우 컴파일이 필요하지 않습니다. 라이브러리가 많을수록 컴파일에 더 많은 시간이 소요된다는 말은 물론 사실입니다.
Cornelius

9

첫 번째 요청에 대한 느린 반응은 IIS가 첫 번째 들어오는 요청에서 사이트 또는 응용 프로그램 풀만 시작 /로드하기 때문입니다. 그리고 일정 시간이 지나면 새로운 들어오는 요청이 서버에 도착하지 않아 IIS가 사이트를 다시 중지합니다 (앱 풀 재활용).

ASP.NET 4.0에는 자동 시작이라는 새로운 기능이 있습니다. 이 기능을 사용하면 요청 전에 응용 프로그램 풀 또는 개별 사이트가 시작되도록 설정할 수 있습니다. 부팅시 (IIS가 시작될 때) 또는 ASP.NET 사이트를 업데이트 할 때 (사이트가 중지 될 때) 트리거됩니다.

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

이것을 사용하려면 IIS 7.5가 필요합니다.

예를 들어 자동 시작이 시작될 때 특정 추가 작업을 수행하는 옵션도 있습니다. 캐시에 데이터를 미리로드합니다.


일반적으로 웹 서버에 배치하기 전에 전체 사이트를 컴파일하므로 첫 번째 요청에서 코드를 더 이상 컴파일 할 필요가 없습니다. JIT는 웹 사이트에서 소스 코드를 게시하는 App_code 폴더를 사용하는 사이트에만 사용됩니다.
Stief

2

문제의 일부는 GAC이기도합니다. 라이브러리는로드 될 때마다 보안 검사가 필요합니다. 즉, 전체 암호화 유형 작업이 수행되고 있기 때문에 작업 속도가 크게 느려집니다. MS가이 문제를 설명한 WPF 성능에 대한 이야기가있었습니다. "도움이되지 않으면 GAC에 물건을 넣지 마십시오"


1
이중 부정을 피하기 위해 "도움이 될 수있다"
Richard Szalay

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