Por que, após cada reinicialização, meus sites .NET locais levam um tempo para carregar pela primeira vez? [fechadas]


27

Estou desenvolvendo sites baseados na plataforma .NET. Normalmente implanto esses sites no meu IIS local, para que eu possa testá-los e ver sua funcionalidade antes de entrar no ar. No entanto, sempre que reinicio o Windows, parece que os sites demoram muito tempo para serem executados pela primeira vez.

Conheço o JIT e também estou ciente dessa pergunta , mas ela não responde à minha pergunta.

O JIT acontece toda vez que você reinicia o Windows? Está relacionado com a criação do processo w3wp.exe? Por que os sites são tão lentos para a primeira solicitação após cada reinicialização?


3
Isso é conhecido como "partida a frio" ou algo assim. O sistema tem de carregar o w3wp na memória, que também precisa de todas as DLLs relacionadas, provavelmente coisas JIT, mesas de importação processo, ler dados do disco, uma vez que não está em cache de memória RAM, etc.
Coder

@ Codificador, +1 para o seu comentário. Mas você poderia explicar mais em uma resposta, para que eu e outro desenvolvedor usássemos o benefício. :)
Saeed Neamati

Como o IIS não é minha especialidade, espero que alguém dê uma resposta melhor. Aqui está um tópico semelhante que eu comecei há algum tempo atrás stackoverflow.com/questions/3807791/cold-startup-optimization Talvez ajude um pouco mais.
Coder

4
Esta pergunta parece estar fora de tópico, porque se trata de um problema de implementação e não de um problema de programação conceitual.

Respostas:


32

Esse problema é a compilação JIT. O pool de aplicativos precisa de tempo para construir as bibliotecas antes de poder começar a processá-las. Isso pode ser acelerado usando um script de aquecimento, mas é algo que precisa acontecer. Também depende se você está usando um site ou um projeto de aplicativo da web. Um site é JIT para cada página, portanto, o primeiro hit é lento e cada novo hit de página também tem um tempo de compilação extra. Os projetos de aplicativos da Web são pré-compilados, portanto, não devem sofrer tanto com esse impacto, mas as bibliotecas ainda precisam ser carregadas. Quanto mais bibliotecas / ferramentas você tiver, pior será esse resultado. Aqui estão alguns links que discutem o aquecimento:

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 /programming/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-scripts /


6
Isso é mais correto, mas há uma diferença entre compilar e jitting que não está clara nesta resposta. A montagem está compilando o bytecode .NET no código da máquina. O ASP.NET está realmente compilando essas páginas da Web, mesmo em um Projeto de Aplicativo da Web (a menos que você use o aspnet_compiler). Todo esse tempo de compilação / construção, mais o tempo de carregamento da biblioteca e da biblioteca, é o motivo pelo qual é tão lento.
Aaronaught

JIT significa just-in-time. Não há diferença entre "jitting" e "compilação", além do tempo e da quantidade de código compilado. Além disso, a compilação JIT acontece apenas para cada código não visitado , não necessariamente para cada página. Se eles usam o mesmo modelo, por exemplo, a compilação não é necessária. A observação de que mais bibliotecas levam a mais tempo necessário para compilar é completamente verdadeira, é claro.
Cornelius

9

A reação lenta da sua primeira solicitação é que o IIS inicia / carrega apenas um site ou pool de aplicativos na primeira solicitação de entrada. E após um período fixo, nenhuma nova solicitação de entrada chega ao servidor. O IIS interrompe o site novamente (reciclagem do pool de aplicativos).

O ASP.NET 4.0 possui um novo recurso chamado inicialização automática. Com esse recurso, você pode definir um pool de aplicativos ou site individual para iniciar-se antes de qualquer solicitação. Isso é acionado no momento da inicialização (quando o IIS é iniciado) ou quando você atualiza um site ASP.NET (que interrompe o site).

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

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

Você precisa do IIS 7.5 para usar isso.

Há também uma opção para executar determinadas tarefas extras quando o início automático é iniciado, por exemplo. para pré-carregar dados no cache.


Normalmente, você compila seu site completo antes de colocá-lo no servidor da web, para que o código não precise mais ser compilado na primeira solicitação. O JIT é usado apenas para sites que usam a pasta App_code onde você publica seu código-fonte no site.
Stief

2

Parte do problema também é o GAC. Nas bibliotecas de locais em que será necessário verificar a segurança sempre que forem carregados - isso significa que toda uma carga de trabalho do tipo de criptografia está sendo realizada, e isso torna as coisas muito mais lentas. Houve uma conversa sobre o desempenho do WPF na MS que descreveu esse problema - a resposta deles foi "não coloque coisas no GAC se você não puder evitar"


1
Isso deve ser "posso ajudá-lo" para evitar uma dupla negativa
Richard Szalay

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.