J'ai un service Windows C # actionnant en tant que serveur, le service contient des structures de données importantes (> 8 Go) en mémoire et expose les méthodes de recherche aux clients via des télécommandes.
L'opération de recherche AVG est exécutée dans
Je remarque une dégradation de performance grave (> 6000ms) sur une base régulière pendant quelques secondes p>
Ma meilleure estimation est que les threads de serveur sont arrêtés par une collection de déchets Gen2 à partir de temps à la fois. p>
Je envisage de passer de Server GC à Workstation GC et enveloppez ma méthode de recherche dans celle-ci pour empêcher GC pendant les demandes. P>
static protected void DoLowLatencyAction(Action action)
{
GCLatencyMode oldMode = GCSettings.LatencyMode;
try
{
GCSettings.LatencyMode = GCLatencyMode.LowLatency;
// perform time-sensitive actions here
action();
}
finally
{
GCSettings.LatencyMode = oldMode;
}
}
3 Réponses :
Je n'ai pas utilisé Cependant, êtes-vous sûr que vous utilisez le serveur Gc? Par défaut, Windows Services utilise le poste de travail GC. P> J'ai déjà eu un problème similaire dans un service Windows et définir le mode GC de serveur à l'aide de: P> gclatencyMode code> avant que vous ne puissiez pas commenter s'il s'agit d'une bonne idée ou non. <configuration>
<runtime>
<gcServer enabled="true" />
</runtime>
</configuration>
Je suis surpris que votre méthode de recherche déclenche même un GC, si le DataStructure de 8 Go est statique (non modifié beaucoup en ajoutant ou en retirant de celui-ci), et tout ce que vous faites est la recherche, vous devriez simplement essayer d'éviter d'allouer Objets temporaires dans votre méthode de recherche (si vous le pouvez). Créer des objets est la chose qui déclenche un GC, et si vous avez une structure de données rarement modifiée, il est logique d'éviter tout ensemble le GC (ou de le retarder le plus possible). P>
GCSettings.LowLatence est-ce que cela donne un indice à la GC pour faire des collections désireuses, de sorte que nous puissions éviter les collections de GEN2 pendant que le mode LowlaTy est défini. Ce que cela fait comme effet secondaire consiste à rendre le GC désireux de collecter à l'extérieur de la région où le mode Lowla et peut entraîner des performances inférieures (dans ce cas, vous pouvez essayer le mode GC du serveur). P>
Cela ne ressemble pas à une bonne idée. À un moment donné, le GC ignorera votre allusion et faire la collection de toute façon. P>
Je crois que vous aurez beaucoup de succès en profilant et en optimisant votre service. Exécutez Perfview (gratuit, génial, outil Microsoft) sur votre serveur lorsqu'il est en cours d'exécution. Voir qui possède des objets gênants et combien de longs événements de GC à long terme spécifiques prennent. P>
Ne devinez pas à la cause. Utilisez un profileur, des comptoirs de performance, une journalisation, etc. pour déterminer quel est le problème réel.
Ouais. J'ai utilisé des compteurs de performance et de la journalisation et c'est le temps de GC.