Corrigindo o carregamento inicial lento para o IIS

129

O IIS possui um recurso irritante para sites de baixo tráfego, onde recicla processos de trabalho não utilizados, fazendo com que o primeiro usuário do site, após algum tempo, obtenha um atraso extremamente longo (mais de 30 segundos).

Estive procurando uma solução para o problema e encontrei essas possíveis soluções.

A. Use o plug-in de inicialização do aplicativo

B. Use o arranque automático com o .NET 4

C. Desative o tempo limite ocioso (em Redefinição do IIS)

D. Pré-compile o site

Gostaria de saber qual é o preferido e, mais importante, por que existem tantas soluções para o mesmo problema? (Meu palpite é que eles não são, e eu simplesmente não estou entendendo algo corretamente).

Editar

Executar C parece ser suficiente para manter meu site aquecido, mas descobri que a verdadeira raiz da lentidão do meu site tem a ver com o Entity Framework, que não consigo entender por que está ficando frio. Veja esta pergunta, que infelizmente ainda não foi respondida, ainda foi respondida!

Acabei precisando fazer um script de aquecimento para acessar meu site ocasionalmente para garantir que ele permanecesse rápido.

Cavyn VonDeylen
fonte
Oi amigo, C é suficiente? Por quê ? Só precisamos usá-lo ou desativar a reciclagem também? Eu sempre me sinto segundo dia primeiro pedido muito lento de IIS7.5
qakmak

Respostas:

36

As opções A, B e D parecem estar na mesma categoria, uma vez que influenciam apenas a hora de início inicial; elas fazem o aquecimento do site, como compilação e carregamento de bibliotecas na memória.

O uso de C, configurando o tempo limite inativo, deve ser suficiente para que as solicitações subsequentes ao servidor sejam atendidas rapidamente (reiniciar o pool de aplicativos leva algum tempo - na ordem de segundos).

Tanto quanto sei, o tempo limite existe para economizar memória de que outros sites em execução paralelo nessa máquina possam precisar. O preço é que um tempo de carregamento lento.

Além do fato de o pool de aplicativos ser desligado em caso de inatividade do usuário, o pool de aplicativos também será reciclado por padrão a cada 1740 minutos (29 horas).

Do technet:

Os pools de aplicativos dos Serviços de Informações da Internet (IIS) podem ser reciclados periodicamente para evitar estados instáveis ​​que podem levar a falhas, travamentos ou vazamentos de memória de aplicativos.

Desde que a reciclagem do pool de aplicativos permaneça ativada, isso deve ser suficiente. Mas se você realmente deseja um desempenho de alto nível para a maioria dos componentes, também deve usar algo como o Módulo de Inicialização de Aplicativos que você mencionou.

Răzvan Flavius ​​Panda
fonte
Então, você recomendaria apenas desativar o tempo limite de inatividade? Isso causaria problemas ao longo da linha (acho que está lá por uma razão)?
Cavyn VonDeylen
3
Na verdade, isso não resolve o meu problema (consulte minha edição), mas aceitei desde que você respondeu à minha pergunta original.
Cavyn VonDeylen
10

Desafio de hospedagem na web

Lembre-se de que nenhuma das opções de configuração da máquina estará disponível se você estiver hospedado em um servidor compartilhado, como muitos de nós (empresas e indivíduos menores).

Sobrecarga do ASP.NET MVC

Meu site leva pelo menos 30 segundos quando não é acessado em mais de 20 minutos (e o aplicativo Web foi interrompido). Isto é terrível.

Outra maneira de testar o desempenho

Há outra maneira de testar se é a inicialização do ASP.NET MVC ou outra coisa. Solte uma página HTML normal em seu site, onde você pode acessá-la diretamente.
Se o problema estiver relacionado à inicialização do ASP.NET MVC, a página HTML será renderizada quase imediatamente, mesmo quando o aplicativo Web não tiver sido iniciado.
Foi assim que reconheci que o problema estava na inicialização do ASP.NET MVC. Carreguei uma página HTML a qualquer momento e ela carregaria rapidamente. Depois de acessar a página HTML, eu atingia um dos meus URLs do ASP.NET MVC e recebia a mensagem do Chrome "Aguardando raddev.us ..."

Outro teste com script útil

Depois disso, escrevi um script LINQPad (confira http://linqpad.net para saber mais) que acessaria meu site a cada 8 minutos (menos do que o tempo para o aplicativo descarregar - que deve ser de 20 minutos) e deixei funciona por horas.

Enquanto o script estava sendo executado, eu acessava meu site e toda vez que ele aparecia rapidamente. Isso me dá uma boa idéia de que provavelmente a lentidão que eu estava enfrentando era devido aos tempos de inicialização do ASP.NET MVC.

Obtenha o LinqPad e você poderá executar o script a seguir - basta alterar o URL para seu próprio país, deixá-lo executar e você pode testar isso facilmente. Boa sorte.

NOTA : No LinqPad, você precisará pressionar F4 e adicionar uma referência ao System.Net para adicionar a biblioteca que recuperará sua página.

TAMBÉM : certifique-se de alterar a variável URL da String para apontar para uma URL que carregará uma rota do site ASP.NET MVC para que o mecanismo seja executado.

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";
    }
}
raddevus
fonte
3

Escrever um serviço / script de ping para atingir seu site inativo é o melhor caminho a percorrer, porque você terá um controle completo. Outras opções que você mencionou estariam disponíveis se você alugou uma caixa de hospedagem dedicada.

Em um espaço de hospedagem compartilhada, os scripts de aquecimento são a melhor defesa de primeiro nível (a auto-ajuda é a melhor ajuda). Aqui está um artigo que compartilha uma idéia de como fazê-lo a partir de seu próprio aplicativo da web .

David Chelliah
fonte
acaba de atualizar esta discussão antiga, no caso de alguém pesquisas para o mesmo
David Chelliah
2

Eu usaria B porque, em conjunto com a reciclagem do processo do trabalhador, haveria apenas um atraso durante a reciclagem. Isso evita o atraso normalmente associado à inicialização em resposta à primeira solicitação após a ociosidade. Você também consegue manter os benefícios da reciclagem.

Kit
fonte
2

Uma boa opção para executar ping no site em uma programação é usar o Microsoft Flow, que é gratuito para até 750 "execuções" por mês. É muito fácil criar um fluxo que chegue ao seu site a cada hora para mantê-lo quente. Você pode até solucionar o limite de 750 criando um único fluxo com atrasos que separam vários hits do seu site.

https://flow.microsoft.com

LMK
fonte
1

Consulte este artigo para obter dicas sobre como ajudar a problemas de desempenho. Isso inclui os dois problemas de desempenho relacionados à inicialização, na seção "inicialização a frio". A maior parte disso será importante, independentemente do tipo de servidor que você estiver usando, localmente ou em produção.

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

Se o aplicativo desserializar qualquer coisa do XML (e isso inclui serviços da Web ...), verifique se o SGEN é executado em todos os binários envolvidos na desseriaização e coloque as DLLs resultantes no Global Assembly Cache (GAC). Isso pré-compila todos os objetos de serialização usados ​​pelos assemblies que o SGEN foi executado e os armazena em cache na DLL resultante. Isso pode economizar muito tempo na primeira desserialização (carregamento) de arquivos de configuração do disco e nas chamadas iniciais aos serviços da Web. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Se algum servidor IIS não tiver acesso de saída à Internet, desative a verificação da lista de revogação de certificados (CRL) dos binários Authenticode adicionando generatePublisherEvidence = ”false” em machine.config. Caso contrário, todos os processos de trabalho podem travar por mais de 20 segundos durante a inicialização enquanto o tempo limite tenta se conectar à Internet para obter uma lista de 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

Considere usar o NGEN em todas as montagens. No entanto, sem uso cuidadoso, isso não gera muito ganho de desempenho. Isso ocorre porque os endereços de carregamento base de todos os binários carregados por cada processo devem ser cuidadosamente definidos no tempo de compilação para não se sobreporem. Se os binários tiverem que ser reformulados quando carregados devido a conflitos de endereço, quase todos os ganhos de desempenho do uso do NGEN serão perdidos. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

nuzzolilo
fonte
0

Eu estava recebendo um atraso consistente de 15 segundos na primeira solicitação após 4 minutos de inatividade. Meu problema era que meu aplicativo estava usando a autenticação integrada do Windows no SQL Server e o perfil do serviço estava em um domínio diferente do servidor. Isso causou uma autenticação entre domínios do IIS para SQL na inicialização do aplicativo - e essa foi a fonte real do meu atraso. Eu mudei para usar um logon SQL em vez de autenticação do Windows. O atraso se foi imediatamente. Ainda tenho todas as configurações de inicialização de aplicativos em funcionamento para ajudar a melhorar o desempenho, mas elas podem não ter sido necessárias no meu caso.

Droobie
fonte