web-dev-qa-db-fra.com

Comment "réchauffer" Entity Framework? Quand devient-il "froid"?

Non, la réponse à ma deuxième question n'est pas l'hiver.

Préface:

J'ai fait beaucoup de recherches récemment sur Entity Framework et ce qui continue de me déranger, ce sont ses performances lorsque les requêtes ne sont pas préchauffées, appelées requêtes froides.

J'ai parcouru l'article considérations de performances pour Entity Framework 5.0. Les auteurs ont présenté le concept des requêtes chaudes et froides et leurs différences , que j'ai moi-même remarqué sans connaître leur existence. Ici, il vaut probablement la peine de mentionner que je n'ai que six mois d'expérience derrière le dos.

Maintenant, je sais quels sujets je peux rechercher en plus si je veux mieux comprendre le cadre en termes de performances. Malheureusement, la plupart des informations sur Internet sont obsolètes ou gonflées de subjectivité, d'où mon incapacité à trouver des informations supplémentaires sur le sujet des requêtes Warm vs Cold.

Fondamentalement, ce que j'ai remarqué jusqu'à présent, c'est que chaque fois que je dois recompiler ou que les résultats de recyclage, mes requêtes initiales deviennent très lentes. Toute lecture de données ultérieure est rapide ( subjective), comme prévu.

Nous migrerons vers Windows Server 2012, IIS8 et SQL Server 2012 et en tant que Junior, je me suis en fait donné l'occasion de les tester avant le reste. Je suis très heureux qu'ils aient introduit un module d'échauffement qui préparera ma candidature pour cette première demande. Cependant, je ne sais pas comment procéder pour réchauffer mon Entity Framework.

Ce que je sais déjà vaut la peine d'être fait:

  • Générez mes vues à l'avance comme suggéré.
  • Déplacez éventuellement mes modèles dans un assemblage séparé.

Ce que je considère faire, en allant avec bon sens, approche probablement fausse :

  • Faire des données factices lit au démarrage de l'application afin de réchauffer les choses, de générer et de valider les modèles.

Questions:

  • Quelle serait la meilleure approche pour avoir une haute disponibilité sur mon Entity Framework à tout moment?
  • Dans quels cas l'Entity Framework devient-il à nouveau "froid"? (Recompilation, recyclage, IIS Redémarrage, etc.)
118
Peter
  • Quelle serait la meilleure approche pour avoir une haute disponibilité sur mon Entity Framework à tout moment?

Vous pouvez opter pour un mélange de vues prégénérées et de requêtes compilées statiques.

Statique CompiledQuerys sont bons car ils sont rapides et faciles à écrire et contribuent à augmenter les performances. Cependant, avec EF5, il n'est pas nécessaire de compiler toutes vos requêtes car EF compilera automatiquement les requêtes lui-même. Le seul problème est que ces requêtes peuvent être perdues lorsque le cache est balayé. Vous souhaitez donc conserver des références à vos propres requêtes compilées pour celles qui ne se produisent que très rarement, mais qui sont coûteuses. Si vous placez ces requêtes dans des classes statiques, elles seront compilées lorsqu'elles seront requises pour la première fois. Cela peut être trop tard pour certaines requêtes, vous pouvez donc forcer la compilation de ces requêtes lors du démarrage de l'application.

La génération de vues est l'autre possibilité, comme vous le mentionnez. Surtout pour les requêtes qui prennent très longtemps à compiler et qui ne changent pas. De cette façon, vous déplacez la surcharge de performances de l'exécution vers la compilation. De plus, cela n'introduira aucun décalage. Mais bien sûr, ce changement passe par la base de données, donc ce n'est pas si facile à gérer. Le code est plus flexible.

N'utilisez pas beaucoup d'héritage TPT (c'est un problème de performance général dans EF). Ne construisez pas vos hiérarchies d'héritage trop profondément ni trop largement. Seules 2 à 3 propriétés spécifiques à une classe peuvent ne pas suffire pour nécessiter un propre type, mais peuvent être traitées comme des propriétés facultatives (nullables) d'un type existant.

Ne vous accrochez pas à un seul contexte pendant longtemps. Chaque instance de contexte possède son propre cache de premier niveau qui ralentit les performances à mesure qu'elle grandit. La création de contexte est bon marché, mais la gestion de l'état à l'intérieur des entités mises en cache du contexte peut devenir coûteuse. Les autres caches (plan de requête et métadonnées) sont partagés entre les contextes et mourront avec l'AppDomain.

Dans l'ensemble, vous devez vous assurer d'allouer des contextes fréquemment et de les utiliser uniquement pendant une courte période, que vous pouvez démarrer rapidement votre application, que vous compilez des requêtes qui sont rarement utilisées et fournissez des vues prégénérées pour les requêtes qui sont essentielles aux performances et souvent utilisées.

  • Dans quels cas l'Entity Framework devient-il à nouveau "froid"? (Recompilation, recyclage, IIS Redémarrage, etc.)

Fondamentalement, chaque fois que vous perdez votre AppDomain. IIS effectue des redémarrages toutes les 29 heures , donc vous ne pouvez jamais garantir que vous aurez vos instances autour. Aussi après un certain temps sans activité, l'AppDomain est également arrêté. Vous devriez essayer de revenir rapidement. Vous pouvez peut-être effectuer une partie de l'initialisation de manière asynchrone (mais méfiez-vous des problèmes de multithread). Vous pouvez utiliser des tâches planifiées qui appellent des pages factices dans votre application pendant les périodes où il n'y a aucune demande pour empêcher la AppDomain de mourir, mais il finira par.

Je suppose également que lorsque vous modifiez votre fichier de configuration ou modifiez les assemblages, il y aura un redémarrage.

55
Andreas

Si vous recherchez des performances maximales pour tous les appels, vous devez examiner attentivement votre architecture. Par exemple, il peut être judicieux de pré-mettre en cache les recherches souvent utilisées dans le serveur RAM lorsque l'application se charge au lieu d'utiliser des appels de base de données à chaque demande. Cette technique garantit des temps de réponse d'application minimaux pour les données couramment utilisées. Cependant, vous devez vous assurer d'avoir une politique d'expiration bien tenue ou toujours vider votre cache chaque fois que des modifications sont apportées qui affectent les données mises en cache pour éviter les problèmes de concurrence.

En général, vous devez vous efforcer de concevoir des architectures distribuées pour ne nécessiter que des demandes de données basées sur IO lorsque les informations mises en cache localement deviennent obsolètes ou doivent être transactionnelles. Toute demande de données "over the wire" sera normalement il faut 10 à 1 000 fois plus de temps pour récupérer qu'une récupération locale dans le cache mémoire. Ce seul fait rend souvent les discussions sur les "données froides et chaudes" sans importance par rapport au problème de données "local contre distant".

9
mcstar

Conseils généraux.

  • Effectuez une journalisation rigoureuse, y compris ce qui est accessible et l'heure de la demande .
  • Effectuez des requêtes factices lors de l'initialisation de votre application pour un démarrage à chaud des requêtes très lentes que vous avez récupérées à l'étape précédente.
  • Ne vous embêtez pas à optimiser, sauf si c'est un vrai problème, communiquez avec le consommateur de l'application et demandez. Soyez à l'aise d'avoir une boucle de rétroaction continue, ne serait-ce que pour comprendre ce qui doit être optimisé .

Maintenant pour expliquer pourquoi les demandes factices ne sont pas la mauvaise approche .

  • Moins de complexité - Vous réchauffez l'application d'une manière qui fonctionnera indépendamment des changements dans le cadre, et vous n'avez pas besoin de comprendre éventuellement API funky/frameworks internes pour le faire de la bonne façon .
  • Couverture accrue - Vous réchauffez simultanément toutes les couches de mise en cache liées à la lenteur de la demande.

Pour expliquer quand un cache devient "froid".

Cela se produit sur n'importe quelle couche de votre framework qui applique un cache, il y a une bonne description sur le haut de la page des performances .

  • Chaque fois qu'un cache doit être validé après un changement potentiel qui rend le cache périmé, cela peut être un délai d'attente ou plus intelligent (c'est-à-dire un changement dans l'élément mis en cache).
  • Lorsqu'un élément de cache est expulsé, l'algorithme pour ce faire est décrit dans la section "Algorithme d'éviction de cache" dans l'article sur les performances que vous avez lié , mais en bref.
    • Cache LFRU (le moins fréquemment - récemment utilisé) sur le nombre de hits et l'âge avec une limite de 800 éléments.

Les autres choses que vous avez mentionnées, en particulier la recompilation et le redémarrage de IIS effacez une partie ou la totalité des caches en mémoire.

8
udoprog

Comme vous l'avez dit, utilisez des "vues pré-générées", c'est vraiment tout ce que vous devez faire.

Extrait de votre lien : "Lorsque les vues sont générées, elles sont également validées. Du point de vue des performances, la grande majorité du coût de génération des vues est en fait la validation des vues"

Cela signifie que les performances auront lieu lors de la construction de votre modèle d'assemblage. Votre objet contextuel sautera alors la "requête froide" et restera réactif pendant la durée du cycle de vie de l'objet contextuel ainsi que les nouveaux contextes d'objet ultérieurs.

L'exécution de requêtes non pertinentes n'aura d'autre but que de consommer les ressources système.

Le raccourci ...

  1. Ignorez tout ce travail supplémentaire des vues pré-générées
  2. Créez votre contexte d'objet
  3. Lancez cette douce requête non pertinente
  4. Ensuite, gardez simplement une référence à votre contexte d'objet pendant la durée de votre processus (non recommandé).
3
hotpie

Je n'ai aucune expérience dans ce cadre. Mais dans d'autres contextes, par exemple Solr, les lectures complètement fictives ne seront pas très utiles à moins que vous ne puissiez mettre en cache l'ensemble de la base de données (ou index).

Une meilleure approche serait de consigner les requêtes, d'extraire les plus courantes des journaux et de les utiliser pour se réchauffer. Assurez-vous simplement de ne pas enregistrer les requêtes de préchauffage ou de les supprimer des journaux avant de continuer.

2
estani