9
votes

Outil de profilage de code de production .NET

Y a-t-il un outil de profilage de performances .NET que je puisse s'attacher à un service Windows en cours d'exécution et à faire un échantillonnage d'appel de la pile de base? Ce serait formidable si l'outil ne nécessite aucune installation car je devrai avoir beaucoup de cassettes rouges si le service informatique du client.

merci


Nature du problème de performance: Ce programme présentant un problème de performance fonctionne comme un service Windows et traite des messages de revenus de 200+ appareils mobiles. Typiquement, ce programme peut gérer au moins 10 message par seconde. Malheureusement, après une mise à niveau récente, ce programme pour certaines raisons ne pouvait plus traiter les messages assez rapidement vers 7 heures du matin. Un message est entré et il pourrait s'asseoir dans la file d'attente interne du programme pendant plus de 10 minutes avant de pouvoir être traitée. Nous remarquons également que le programme utilise plus haut que la CPU normale. Typiquement, il devrait être de 5% sur la machine de huit noyau, il est maintenant de 20 à 25%.

Le programme fait plus que manipuler des messages entrants, il conserve également la base de données et desservir des données aux clients. Il dispose de cinq threads gère les messages entrants et tout travail de maintenance s'exécute sur le thread.

La solution de contournement actuelle consiste à redémarrer le service lorsque le ralentissement se produit. Après un redémarrage, le programme serait à nouveau normal (CPU sous 5%). Jusqu'au lendemain matin, environ 7 heures du matin, cela arriverait des agins. Tous les messages de la file d'attente ont été supprimés après chaque redémarrage. Habituellement, 7 heures et 17h sont le moment où nous recevons beaucoup de messages, mais le problème ne se produit que pendant 7 heures du matin.

Notre équipe a essayé de reproduire le programme en hébergement à l'aide de messages simulés et de comparer le code de code pour voir s'il existe un goulot d'étranglement critique.


3 commentaires

On dirait que le problème pourrait être lié à une fuite de mémoire (peut-être une poignée d'événement non publiée qui provoque un objet ne pouvant jamais être recueilli). Je recommanderais d'exécuter quelque chose comme Debugdiag dessus dans la maison avec les messages de test et voir s'il y a une sorte de fuite de cette nature. Vous pouvez vérifier Ce lien pour télécharger 1.2 Beta, il a une règle spécifiquement pour l'utilisation de la mémoire .NET. Ajoutez vos fichiers PDB et vous pouvez obtenir des numéros de ligne pour les allocations.


Merci pour la suggestion. L'application peut accumuler quelque chose sur une période donnée et ne pas jeter les données, car nous remarquons que la mémoire est supérieure depuis le début de l'application. Cependant, cela n'explique pas directement l'utilisation supérieure à la CPU normale.


Ne sachant pas la nature de votre code, je ne peux pas dire à coup sûr, mais l'utilisation du processeur pourrait augmenter si elle doit faire beaucoup de pagination en raison de la pression de la mémoire ou peut-être que vous iriez une sorte de collection dans votre code que vous avez eu ' t devrait être en croissance, mais c'est et maintenant chaque fois que chaque fois que les données sont soumises à vous, vous êtes obligé d'itérer une plus grande collection ... cela entraînerait certainement la croissance du CPU dans le temps.


4 Réponses :


1
votes

voir si Avicode (récemment acquis par Microsoft) répond à vos besoins. . Ce produit consiste à surveiller la performance des applications dans les environnements de production. Je n'ai pas regardé ce produit dans 10 ans, mais lorsque je l'ai déjà regardé, il a souligné la possibilité d'obtenir des informations d'exception et d'appeler des piles d'applications exécutées en production avec des frais généraux minimes. Il a été construit sur des API de profilage .NET, donc je ne serais donc pas surpris s'il offre également des capacités pour votre scénario d'utilisation de la CPU. Je ne connais pas les détails de ce qui est requis pour l'installer / activer sur un serveur, je ne suis donc pas sûr de savoir s'il effacera facilement vos haies de département informatique.

Découvrez également le comptoirs de performance pour le .NET Framework , qui peut être activé sans toucher votre application ou sa configuration.


0 commentaires

2
votes

Je ne connais aucun profileur que vous pouvez utiliser sans les installer, vous pourriez donc éventuellement avoir à accorder un accord avec le service informatique du client.

Cependant, vous pourrez peut-être obtenir un aperçu en regardant des compteurs de performance .NET. Peut-être que le service fait une collecte excessive des ordures pour une raison quelconque.

Si cela ne donne pas d'indices, vous pouvez utiliser l'explorateur de processus de Sysinternals. Il peut être exécuté sans installation préalable. La fenêtre Propriétés a un threads qui vous montrera tous les fils du processus ainsi que leur temps d'exécution, ce qui pourrait être utile.


0 commentaires

1
votes

Merci pour toutes les suggestions.

J'ai essayé un certain nombre d'outils de profilage, mais tous ont besoin d'une installation, et certains coûts de l'argent.

essayé à l'aide de " Outils de débogage Windows " + " Process Explorer "+" moniteur de processus " Pour voir si je peux obtenir un instantané de la trace de pile du fil d'exécution. Malheureusement, vous ne pouvez pas obtenir notre propre fichier de symboles géré (PDB) pour fonctionner. Je peux voir tous les appels à l'API du noyau, mais aucun de mon propre code.

Heureusement, notre client nous a approuvé à installer un profileur. Si vous avez une version Visual Studio Premium ou Enterprise, il est livré avec un profileur autonome . J'ai pu obtenir un rapport de profil sur la machine client et analyser le rapport à l'aide de Visual Studio.


1 commentaires

Si vous ajoutez l'emplacement de la PDB-S à la configuration du trajet des symboles de l'explorateur de processus qu'il ne doit afficher le chemin de lecture de la vue Threads.