Toda aplicação ASP.NET requer um processo de compilação em memória no servidor e isto leva um tempo perceptível por nossos usuários. Aprenda como evitar esse comportamento.
Na minha vida de consultor eu sempre ouço a mesma pergunta dos meus clientes:
Meu site fica lento na primeira chamada toda vez que faço um deploy ou quando o pool do IIS recicla naturalmente.
Antes de tudo é importante deixar claro que não tem como fugir do processo de reciclagem do pool do IIS, ele pode ocorrer naturalmente por N fatores ou agendado conforme sua configuração.
A demora natural na primeira chamada de uma aplicação ASP.NET é o processo do IIS compilando o assembly da sua aplicação e disponibilizando ele num cache, esse cache é usado nas próximas chamadas e assim sua aplicação volta a responder normalmente sem nenhuma demora aparente. Toda vez que o pool do IIS recicla a memória esse cache é perdido.
Nós não queremos que nossos usuários sejam obrigados a esperar este tempo de compilação que pode chegar em cerca de 30 segundos dependendo do tamanho da aplicação, é por isso que o IIS possui uma feature pouco utilizada chamada de
IIS Auto-Start ou Application Initialization
Para habilitar esse comportamento no seu IIS é necessário instalar o módulo de Application Initialization no seu servidor e seguir alguns passos na configuração do IIS.
*A mesma configuração pode ser feita através da edição dos arquivos de configuração no servidor. Eu prefiro fazer no IIS diretamente, você encontrará esta outra abordagem no link de referência no final do post.
O resultado é muito satisfatório, ao invés da aplicação demorar mais de 10 segundos para responder ela passa a demorar 1 ou 2 segundos.
Para abordar todos os passos necessários em detalhes eu gravei um vídeo de 16 minutos mostrando todo o processo de configuração.
* Assine meu canal no Youtube 🙂
Referências
- Site oficial do IIS
- Smart Store (Demo)
Se você estiver interessado em conhecer mais e aprender como desenvolver aplicações com uma arquitetura responsável utilizando DDD, TDD, BDD, aplicando os princípios SOLID, diversos Design Patterns e escrevendo testes de unidade conheça meus cursos:
Vamos continuar a troca de experiências, deixe seu comentário abaixo, se gostou e concorda com o artigo compartilhe com seus colegas para transmitirmos o conhecimento para o máximo de pessoas possíveis.
Alguma dica para Azure WebSites? Há alguma configuração lá para que o request seja mais rápido?
Show de video
Excelente post, uma dica valiosa. Parabéns.
Realmente é uma diferença significativa no carregamento! Excelente post Eduardo!
Eduardo
Boa tarde
Gostaria de saber se essas dicas podem ser aplicadas para WebApi?
Excelente post!
Dica valiosa, já apliquei aqui e melhorou demais o desempenho! Muito obrigado
Parabéns, estava procurando isso.
Preciso agora colocar isso em prática em cliente que está enfrentando lentidão.
Obrigado
Muito boa esta dica, estou enfrentando este problema.
Mas preciso de saber qual solução os desenvolvedores usam para publicar as aplicações ASP.NET remotamente.
Meu irmão está desenvolvendo um sistema e precisa ter acesso direto ao meu servidor para publicar e atualizar o BD (SQL), direto de seu Visual Studio.
Obrigado
Parabéns pela iniciativa!
Bom dia, pessoal!
Gostaria de saber se o mesmo se aplica ao IIS com o ASP.NET Core?
Não consegui os mesmos resultados.
Bom dia, pessoal!
Gostaria de saber se o mesmo se aplica ao IIS com ASP.NET Core.
Não consegui os mesmos resultados.
O pool de conexões cai todo momento.
Fala galera!
Para quem tem mais de um site (meu caso, rs) e esteja pensando em automatizar com appcmd, o caminho é esse:
%windir%\System32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools “/[name=’nome_do_app_pool’].autoStart:True” /commit:appHost
%windir%\System32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools “/[name=’nome_do_app_pool’].startMode:AlwaysRunning” /commit:appHost
%windir%\System32\inetsrv\appcmd set config -section:system.applicationHost/sites “/[name=’nome_do_site’].[path=’/’].preloadEnabled:True” /commit:appHost
%windir%\System32\inetsrv\appcmd set config -section:system.applicationHost/sites “/[name=’nome_do_site’].[path=’/’].serviceAutoStartEnabled:True” /commit:appHost
Caso o ApplicationPool seja uma application dentro de um site (como no exemplo do Eduardo), só colocar o caminho dele ali em [path=’/’] (tem que ter a barra!). No exemplo do vídeo ficaria: [path=’/SmartShop’]
Abs!
É necessário efetuar a mesma configuração também para os subdomínios?