Lors de la surveillance de notre application dans PERF MON, j'ai remarqué que le% de temps en GC est de 20 à 60%, tandis que notre application effectue un processus de course à long terme (varie entre 30 secondes à 1,5 minutes). Cela me semble un peu excessif pour moi. Cela soulève deux questions importantes. P>
3 Réponses :
Oui, cela semble excessif. La réduction de la quantité de GC serait probablement la meilleure étape que vous pourriez prendre pour réduire le temps d'exécution de votre application (si c'est votre objectif). P>
Un "% de temps en GC" est généralement causé par l'alloué puis jeter des milliers ou des millions d'objets. Un bon moyen de savoir ce qui se passe est d'utiliser un outil de profil de mémoire. P>
Microsoft fournit gratuitement profileur CLR . Cela vous montrera toutes les allocations, mais rendra votre application 10-60 fois plus lente. Vous devrez peut-être peut-être exécuter moins de données d'entrée afin qu'il puisse finir d'analyser dans une quantité de temps raisonnable. P>
Un excellent outil commercial est la profileur de mémoire .NET . Cela impose beaucoup moins de frais généraux d'exécution et il y a un essai gratuit disponible. En prenant plusieurs instantanés lorsque votre processus est en cours d'exécution, vous pouvez savoir quel type d'objets sont fréquemment alloués (puis détruits). P>
Une fois que vous avez identifié la source des allocations, vous devez ensuite examiner le code et déterminer comment ces allocations peuvent être réduites. Bien qu'il n'y ait pas de réponse unique - toutes les réponses, certaines choses que j'ai rencontrées dans le passé incluent: p>
Une autre raison pourrait être beaucoup de collections GEN-1 ou GEN-2, chacune d'entre elles prend beaucoup plus de temps et est causée par une suspension à des objets plus longtemps. P>
J'ai vu cela arriver dans des applications Web lorsque des objets de buggy accrochent sur des objets de page réels - forçant la page à vivre aussi longtemps que les autres objets qui se réfèrent à eux. P>
rompre le lien entre les objets et les pages (dans ce cas) causé à GC de chuter à des valeurs très basses. Notre site a maintenant plus de 100 hits / seconde et GC Time est typiquement de 1% ou moins. P>
suis-je raison que cela excessif? p>
oui, vous êtes correct fort> p>
Comment puis-je comprendre pourquoi la route provoque des pics de GC? P>
1.- Jetez un coup d'œil à perfeview strong> p >
perfview est un outil d'analyse de performance qui aide à isoler la CPU- et
Problèmes de performance liés à la mémoire. P>
blockQuote>
Voir aussi: Améliorer les performances de code géré P>
2.- Voir si GC.Collect ou GC.WAITFORPENDINGSELIALISERS est appelé n'importe où dans votre code ou votre bibliothèque tierce. Ce dernier peut provoquer une utilisation élevée du processeur. P>
FYI, PERFVIEW a déménagé à Github: Github.com/microsoft/perfview/ blob / maître / documentation / ...
Une chose à noter est que ce compteur de performance montre la dernière valeur observée, pas une moyenne continue. Il est seulement mis à jour à la fin de chaque cycle de GC.
C'est dans un service de WCF hébergé.
Le compteur de performance change constamment. Qu'est-ce que cela impliquerait?