ASP.NET MVC: premier accès après quelques minutes de lenteur, puis chaque requête suivante est rapide

quand j'accède à n'importe quelle page de mon ASP.NET MVC site web première fois, puis cette première demande est lente. Il faut environ 4-5 secondes pour le charger. Mais chaque requête suivante à n'importe quelle page est rapide.

quand j'attends quelques minutes ou une heure alors chaque première demande est de nouveau lente. Chaque demande est rapide.

je pense que IIS 7 est de compiler le code et le garder en mémoire. Après un certain temps, il va le supprimer de la mémoire afin qu'il ait besoin de compiler à nouveau.

Ce qui je peux faire ce que chaque première demande est aussi rapide que chaque requête suivante? (Sans précompiler ma source, si possible)

Merci beaucoup d'avance!

24
demandé sur Chris 2010-07-30 21:34:56
la source

5 ответов

il peut s'agir des processus de recyclage mis en place par l'opérateur sur le pool d'application, vérifiez la valeur de ce paramètre et éteignez-le ou allongez-le.

pourrait aussi être le processus de L'Ouvrier D'arrêt après avoir été inactif sous la performance pour le pool d'application.

c'est probablement la seconde par défaut à 20 minutes, la première par défaut à 29 heures je crois.

17
répondu BlackICE 2010-07-30 21:41:43
la source

Si c'est un serveur de production, alors pourquoi ne pas essayer d'ajouter un site web à surveiller;temps de robot. Il demande essentiellement des en-têtes de vos sites Web et obtient des codes de statut comme "200-ok", "404-not found", etc. toutes les 5 minutes. De cette façon, votre site est toujours redirigé vers le haut et n'a pas d'impact sur les fichiers journaux/statistiques car seuls les en-têtes sont demandés. Je l'utilise pour mes sites cloud car je constate qu'ils mettent 5 secondes à tourner vers le haut ce qui a un impact sur le chargement du site. Avec le moniteur ils sont instantané.

Oh, et c'est gratuit jusqu'à 50 sites!

21
répondu Rippo 2010-07-30 22:40:45
la source

il s'agit presque certainement du paramètre idle timeout de votre pool app (et non de votre code recompilé).

le temps mort par défaut de l'application pool dans IIS est de 20 minutes. Ce qui signifie que, si 20 minutes passent et aucune demande ne vient à votre application, IIS sera arrêter le processus de travail pour votre pool d'application, ce qui rend votre application "froide" à nouveau. Celui qui fera la prochaine demande attendra plusieurs secondes pendant que IIS redémarre le processus ouvrier et "réchauffe" votre application retour jusqu'.

si vous ne voulez pas que L'IIS "rafraîchisse" automatiquement votre application après une période d'inactivité, vous pouvez désactiver le délai d'inactivité de l'application pool en le réglant à 0.

5
répondu adamjcooper 2013-07-06 07:36:23
la source

en Supposant que vous avez un flux régulier de visiteurs, cela ne devrait pas être un problème dans la production. En outre, à moins que vous ne modifiez physiquement l'un de vos fichiers source, IIS ne le recompilerait pas quand il lance votre application.

aussi, jetez un coup d'oeil aux paramètres de compilation .NET disponibles: http://technet.microsoft.com/en-us/library/cc725812(WS.10).aspx

1
répondu Cahit 2010-07-30 21:40:32
la source

tl; dr

après des tests assez approfondis et la collecte des sources pertinentes pour tenter de résoudre le problème, je pense que la solution minimale peut-être (non vérifié) pour ajouter ce code au global.asax:

    protected void Application_End()
    {
        ...
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://web_domain.tld");
        using (HttpWebResponse response = (HttpWebResponse)
            request.GetResponse())
        {
        }
        ...
    }

au moment de la rédaction du post, ce est utilisé pour effectevely maintenir le site, j'ai travaillé sur "toujours" - avec la collaboration de réglage de l' Idle Time-out (minutes) dans IIS à 0 comme mentionné dans d'autres réponses. Cependant J' pense que le fait de changer Idle Time-out (minutes) peut ne pas être nécessaire (en supposant que Application_end événement est déclenché lorsque l'interrupteur de demande de la piscine à l'écran de veille se produit).

Comment ça marche (en supposant qu'il n'):

  1. il y a 2 réglages dans le pool d'applications IIS qui affectent quand l'application est suspendue ou terminée. L'un d'eux est Idle Time-out (minutes) qui est par défaut de 20 minutes et quand le temps spécifié s'écoule depuis la dernière demande, le travailleur le processus est suspendu ou résilié. Lorsqu'une requête suivante arrive, le processus worker est repris ou redémarré et L'événement Application_start est soulevé (et donc si le gestionnaire Application_start est défini dans global).asax, il est exécuté). Dans le cas du projet sur lequel j'ai travaillé, L'Application_start a pris environ 17 secondes à compléter. Donc, si le site a été "laissé seul" pendant 21 minutes et que la nouvelle demande est arrivée, cela a pris environ un peu plus de 17 secondes avant que la réponse ne soit renvoyée. (Application_start + traitement de page). Lorsqu'une autre requête a été envoyée dans la fenêtre de 20 minutes, la réponse a été envoyée beaucoup plus rapidement (peut-être moins de 1s), puisque L'Application_start a déjà été traitée.

Idle Time-out (minutes) la valeur 0, le processus de travail ne jamais être suspendu / supprimé (du moins en raison du temps de repos - il peut y avoir une autre cause décrite ci-dessous).

  1. mis à part Idle Time-out (minutes), il y a aussi l' Regular time interval (minutes)Recycling section des paramètres avancés de L'IIS. Ceci vaut par défaut pour 1740 minutes (29 heures) et est une tâche régulière programmée qui fait que le pool D'applications est périodiquement recyclé (la période est fixe). Ceci, j'ai compris, est pour empêcher l'accumulation de fuites de mémoire possibles qui, si elles sont présentes, peuvent éventuellement planter le serveur en exsudant toute la mémoire. L'effet du recyclage app-pool est que L'événement Application_end est soulevé. Cependant, après l'application se termine, il L'événement Application_start n'est donc pas soulevé tant qu'une requête n'est pas arrivée (ce qui est similaire au premier cas). Ainsi, dans le cas de l'application web susmentionnée sur laquelle j'ai travaillé, il faudrait de nouveau environ 17 secondes pour traiter la première demande pour arriver après le recyclage a eu lieu. Changer cette valeur à 0 éteint le recyclage, mais je suppose qu'il est raisonnable de ne pas éteindre complètement le recyclage en raison de la possibilité d'accumulation de mémoire fuites au fil du temps (qui peuvent éventuellement être causées par des bogues dans les bibliothèques de tiers). Je comprends que les avis divergent sur la nécessité de créer cette valeur à 0 ou et peut changer avec le temps.

solution possible (sans modifier les paramètres du SII): Si les requêtes sont envoyées assez souvent, l'app-pool ne peut jamais passer en mode inactif. En cas de recyclage, cela entraînerait également à l'application de recommencer. Ce peut être réalisé, par exemple, en utilisant le service tiers comme décrit par @Rippo.

solution proposée: Il a été observé que le pool d'applications recyclage causés Application_end événement à soulever. En supposant qu'elle soit également soulevée lors de la commutation du pool d'applications vers mode de veille, il semblerait suffisant de créer une requête dans le Application_end le gestionnaire d'événements vers le site web, qui dans les deux cas provoquerait alors l'application pour recommencer (en soulevant L'event Application_start). Le code est en haut de la réponse.

0
répondu davke 2017-05-23 15:02:06
la source

Autres questions sur