6
votes

Débogage Utilisation élevée du processeur sur le processus IIS

Utilisation élevée du processeur sur le processus IIS

Je cherche actuellement une utilisation élevée de la CPU sur l'un de nos serveurs de production, je suis bloqué et j'espère que quelqu'un ici est capable d'aider. Comparer l'utilisation du processeur avec le nombre d'appels de services Web entrants (WCF et Repos) me dit qu'ils ne sont pas liés, l'utilisation de la CPU semble grimper chaque fois que des appels augmentent ou qui tombent. P>

la configuration h3>
  • Windows 2012 R2 Server X64 LI>
  • IIS 8.5 LI>
  • .NET 4.5 LI>
  • Piscine d'applications unique exécutant notre application li>
  • recyclage automatique piscine d'application à 00:00 li> ul>

    Le problème h3>

    Récemment, notre utilisation de la CPU a considérablement augmenté, le motif semble être que l'utilisation de la CPU monte à partir de minuit (où je recyclé de la piscine) et continue de grimper jusqu'à ce que la piscine soit recyclée. p>

    cpu tendance les derniers jours p>

    les données h3 >

    En analysant le TaskManager et en utilisant des compteurs de Perfmon, j'ai été en mesure de confirmer que c'est en effet notre processus W3WP qui consomme la CPU. P>

    J'ai configuré debugdiag 2.1 pour prendre 3 décharges de mémoire 10 secondes à distance lorsque la CPU Consommation élevée sur un seuil de 50% pour plus de 10 secondes. (Utilisation normale du processeur avant que ce problème ne soit 5 à 10%) p>

    regarder dans les fichiers de vidage à l'aide de NTSD, je vois que plusieurs threads consomment beaucoup de CPU: P>

    // Execution every minute
    public static void TimerExecutionEveryMinute(object sender, EventArgs e)
    {
        var jpsLogger = KernelContainer.Kernel.Get<IJpsLogger>();
    
        // Initialize MemBag
        MemBag.Log.ActivityIdReset(Guid.NewGuid());
        MemBag.Log.BaseType = "TimerExecution";
        MemBag.Log.BaseClass = "Timer";
        MemBag.Log.BaseMethod = "TimerExecutionEveryMinute";
    
        // Statistic timer job
        var t1 = jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "One minute timer begin");
    
            var t2 = jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    Method.WriteDB begin");
                Method.WriteDB();
            jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    Method.WriteDB end", t2);
    
            t2 = jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    Memory.LogCurrentState begin");
                Memory.LogCurrentState();
            jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    Memory.LogCurrentState end", t2);
    
    
            //Calculates the CPU load based on samples taken at every timer step
            t2 = jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    CPU load begin");
                CPULogger.LogCpu();
            jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    CPU load end", t2);
    
            // Dump log information to file
            t2 = jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    FileLogger.WriteAsync begin");
                FileLogger.WriteAsync();
            jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "    FileLogger.WriteAsync end", t2);
    
            jpsLogger.Trace.SpecializedDebug("Analyses.OneMinuteTimer", "One minute timer end", t1);
    }
    


8 commentaires

J'ai fait des recherches supplémentaires et il semble que tous les threads en haut de la! FULDAY est des threads GC, pourquoi prendraient-ils adopter tous les cycles de la CPU?


À ce moment-là, ce fil ne faisait rien. Trouvez un fil qui a fait quelque chose. Pouvez-vous joindre Visual Studio? Process Explorer peut également vous montrer des piles de fil d'exécution. Utilisez cette capacité à prendre quelques échantillons en production.


Comment reconquez-vous que le fil ne fait rien? Et comment puis-je trouver ceux qui mettent en réalité la charge sur la CPU? Toutes les bandes de roulement en haut de la! Liste de fugueurs semblent tous attendre quelque chose ..


Notre problème semble être similaire à celui-ci: serverfault.com/questions/614372/... qui est malheureusement sans réponse.


Au fait, je ne peux pas attacher VS à Prod Server. Mais peut-être que je pourrais utiliser des parfums pour voir quels threads font le travail.


Ces threads attendent (waitforsingleObjectex). Il est plausible que ces fils de GC ont consommé beaucoup de processeur, mais en ce moment, ils ne le causent pas. Pouvez-vous exécuter l'explorateur de processus?


Les tiques de minuterie sont affichées sur le fil-piscine. Les «déverrouillés» signifient qu'ils peuvent exécuter simultanément ou après que la minuterie ait été disposée. Vérifiez le nombre de threads pour confirmer votre théorie. Vous devez obtenir des piles de threads qui font quelque chose.


Quel outil pour UTILISATION CPU ? Qu'est-ce que jpslogger = kernelcontainer.kernel.get ? Les échantillons du monde réel open source pour la surveiller?


3 Réponses :


1
votes

Je n'ai pas de réponse, mais laissez-moi essayer de donner des conseils.

Dans votre question, vous mentionnez

Récemment, notre utilisation de la CPU a augmenté de manière drastique ...

Cela implique-t-il que l'application fonctionnait bien avant? Comme dans le cas, il n'y avait pas d'épis de processeur inhabituel que vous étiez au courant?

Si c'est le cas, vous devez regarder ce qui est changé récemment:

  • a tout nouveau code pour votre application a été déployé, plus particulièrement tout ce qui alloue beaucoup de données?

  • Avez-vous été installés sur le serveur, dans l'affirmation, pouvez-vous les audit et consulter les articles de la base de connaissances Microsoft (ou simplement Google le nom de la mise à jour, voir si des blogs les mentionnent) qui pourraient mentionné les symptômes 're rencontre.

    Dans votre situation, on dirait que le collectionneur des ordures va dura du foin. La chose du poing que je ferais est de regarder tout nouveau code qui a été déployé - il pourrait s'agir du fait que le code (ou un effet secondaire de ce code) est alloué d'objets avec un effet secondaire du GC entrant dans l'overdrive pour faire face à la mémoire. pression.

    Avec cela à l'esprit, pourquoi ne pas télécharger une version trancheuse d'un outil de gestion de mémoire .NET telle que Profileur de mémoire des fourmis de Redgate et prenez des instantanés de décharges de mémoire pendant les pics. L'utilisation d'outils comme celle-ci est plus facile à faire des comparaisons entre les décharges, telles que vous indiquer le nombre d'objets alloués / distribués, quantité de mémoire utilisée, etc. Cela pourrait vous donner un indice.


3 commentaires

Merci de votre contribution. Je n'ai pas pu identifier si des modifications apportées à notre codeBase pourraient être la raison de la charge de la CPU de haute hauteur, car nous utilisons de la delevery continue et que nous avons d'abord vu le problème lorsque la CPU a formé une journée et que les appels entrants ont commencé jusqu'à l'heure, nous avons résolu cela en changeant. Le serveur (virtuel) de 4 CPU à 16 processeurs de CPU qui est une solution temporaire. En ce qui concerne les mises à jour du serveur, nous avons récemment changé de 2008 R2 à 2012, qui pourrait être importante ici, mais je ne sais tout simplement pas comment prouver / réfuter cela.


Nous avons le paquet Jetbrains (DotTrace et DotMemory) mais ils semblent être buggy et j'ai peur de planter notre serveur en direct tout en les utilisant. Obtenir également la permission de mettre 3. Les logiciels de parti sur nos serveurs Prod sont un grave en raison des règles de la part de cela.


Ah Yeah, j'ai oublié que ceci est un problème de serveur en direct. Dans ce cas, je n'essayerais pas d'installer de logiciels tiers de diagnostic, comme vous l'expliquez.



0
votes

un peu longtemps pour un commentaire, donc un wiki communautaire pour partager mon expérience.

En arrière, nous avons eu un problème similaire causé par un code médiocre (vu dans le réflecteur; p) dans le pilote Sybase .NET qui verrouille chaque commande de dB, au lieu de simplement quand il était nécessaire (IIRC pour une transaction ). La mise à jour d'un nouveau pilote avec un verrouillage finisseur a été résolu sur le problème et les serveurs ont fonctionné sans heurts depuis.

Regarder vos informations, il semble très similaire à ce que nous avons expérimenté. Debugdiab m'a fiiblement informé que le verrouillage était un problème et me conduit à trouver une solution. Assurez-vous de configurer vos décharges correctement.

Il aide également si vous avez un serveur de stockage que vous pouvez marteler avec la charge (par exemple avec JMeter) pour débogdiag.

Une autre approche, bien que fastidieuse, consiste à décoller toutes les assemblées chargées, à l'exclusion des cadres. Ensuite, inspectez-les dans votre décompiler préféré à la recherche de moniteur.enter (...) des références utilisées dans votre application (peut-être exécuter une couverture si vous pouvez simuler une production extérieure, pour voir ce qui est utilisé). Ensuite, essayez d'identifier le verrouillage trop optimiste. Si votre propre code, vous pouvez le réparer, sinon contactez le fournisseur.


6 commentaires

Merci. Informations très utiles ici. En fait, j'ai un serveur de scène que j'ai frappé durement avec JMeter, mais j'ai été incapable de charger des CPU aussi haut que sur Live malgré que le serveur de production est de 16 noyaux et que la mise en scène est de seulement 4.


ongledice: moins de noyaux signifie que ce sera probablement plus facile à reproduire :)


Oui! Tu penserais que ça va? Mais il semble que ce ne soit pas le cas. Dans mon chargement de JMeter, je ne saisis que les 10 méthodes les plus utilisées dans nos points d'extrémité (~ ~ Ceux avec plus d'un coup chaque seconde), je pourrais être que l'une de nos méthodes moins utilisées est de causer le ravage. Consultez les nouvelles informations que j'ai ajoutées à la question initiale.


ongledice: lancer au moins 100 demandes simultanées à ce sujet.


Je vais essayer de la presser encore plus fort lundi, je rentre maintenant à la maison pour avoir une bière froide. Au fait, je suis toujours très intéressé par la manière dont je peux résoudre une poignée au fichier en fait, il pointe de ...


@édice :: D Je viens de craquer mon premier.



1
votes

OK, voici une réponse partielle à vos problèmes. Il semble qu'il existe de multiples raisons de l'utilisation élevée de la CPU, mais j'ai réussi à trouver l'une des raisons pour lesquelles le GC était fou.

Quelque part dans notre code, un développeur avait inséré un morceau de code qui a enregistré l'utilisation actuelle du RAM ( pour la surveillance et le débogage) Chaque minute. Ceci a été implémenté comme celui-ci: P>

GC.GetTotalMemory(true)


0 commentaires