web-dev-qa-db-fra.com

Comment savoir ce que w3wp.exe fait? (ou comment diagnostiquer un problème de performances)

J'ai un problème de performances dans un site que nous avons créé et je ne sais pas exactement comment commencer à le diagnostiquer.

La description courte est: Nous avons un très petit site ( http://hearablog.com ) avec très peu de trafic, dans un serveur dédié merdique, le CPU est toujours très élevé, parfois il reste à 100% pendant quelques minutes, et w3wp.exe en prend la plupart. Un scénario typique est w3wp.exe prend 60% et SQL Server prend environ 30%. Notre base de données est également assez petite.

Description longue et plus de détails:

  • Le site est hébergé sur un serveur très merdique par Cari.Net. Dès le début, nous avions le sentiment que le serveur ne se comportait pas tout à fait correctement, comme certaines choses prendraient trop de temps, donc cela pourrait être un problème de configuration dès le départ. Il peut également que nous obtenions un serveur virtuel alors que nous sommes censés en avoir un dédié, bien que nous n'ayons aucune preuve qui l'indiquerait , sauf que le serveur a tendance à être assez lent.

  • Le serveur est Windows 2008 Standard 64 bits, avec SQL 2008 Express

  • Le matériel est un Celeron 2,80 GHz, 1 Go de RAM

  • Le site Web est développé dans ASP.Net MVC, en utilisant Entity Framework pour l'accès aux données.

  • Maintenant, c'est un matériel assez merdique, mais j'ai eu d'autres serveurs avec ces gars, avec un matériel équivalent (ou pire), et les performances sont bien meilleures que celui-ci. Cela dit, les autres serveurs ont W2003 et SQL2005, et j'utilise ASP.Net "WebForms" 2.0, pas de MVC, pas de LINQ, pas d'EF; donc je ne sais pas si aller à 2008/les autres choses signifie une grosse pénalité de performance est attendue.

  • Je sers régulièrement des fichiers MP3 (5-20 Mo), ce qui est une charge légèrement inhabituelle, peut-être que cela cause des problèmes?
    Est-ce que w3wp utiliserait beaucoup de CPU?

  • L'utilisation du disque semble très faible. La mémoire est généralement d'environ 90%, mais l'utilisation du disque semble indiquer que la pagination n'est pas importante.

  • Je reçois tonnes d'e-mails chaque jour sur les délais d'attente SQL, pour les requêtes prenant plus de 30 secondes, bien que toutes nos requêtes soient assez simples (ou devraient l'être, mais EF peut être en train de le visser).

Voici à quoi ressemble le moniteur de ressources dans l'un de ces "sprints" 100% CPU, au cas où il y aurait quelque chose d'utile.

alt text

Et un instantané de certains compteurs de performances: alt text

Maintenant, ce qui m'embrouille beaucoup, c'est que l'utilisation du processeur de w3wp est tellement élevée. Ça ne devrait pas faire grand-chose vraiment ... Alors mes questions sont ...

  • Existe-t-il un moyen de découvrir "ce" qu'il fait? Peut-être même le profiler?
  • Des compteurs de performance que je devrais regarder?
  • Est-ce à prévoir étant donné cette configuration matérielle/logicielle?
  • Est-ce que cela pourrait être dû à une sorte d'échec de configuration, où commenceriez-vous à chercher?

Merci beaucoup.
Daniel Magliola

42
Daniel Magliola

Vous pouvez également utiliser l'interface utilisateur des processus de travail dans IIS Manager et inspecter les requêtes en cours d'exécution et voir où elles se bloquent le cas échéant. Ouvrir IIS Manager -> Cliquez sur le serveur dans l'arborescence-> Double-cliquez sur l'icône Processus de travail-> Double-cliquez sur le processus de travail qui consomme le processeur pour voir les demandes en cours d'exécution en temps réel afin que vous puissiez voir quel module prend du temps.

Pensez également à utiliser le suivi des demandes ayant échoué pour suivre une partie du temps par demande pour voir où elles prennent du temps.

42

Ok, pour commencer - le serveur est vraiment merdique. Mais cela DEVRAIT être suffisant.

  • Pour la virtualisation, vérifiez vos pilotes. Je ne connais aucune plate-forme de virutalisation qui cache le CPU (et je suppose que quelqu'un met un hyper-v ou esx sur un celeron) mais les pilotes pour le disque etc. sont une indication.

  • Le CPU ne doit pas être aussi élevé. Malheureusement, avec cette RAM, vous êtes à peu près toast - si vous commencez à ajouter un profileur, vous soufflerez à peu près la mémoire que vous avez.

Je voudrais:

  • Vérifiez les journaux pour les choses qui s'exécutent en ce moment.
  • Mettez à niveau le système d'exploitation vers 2008 R2 - BEAUCOUP plus d'informations y sont disponibles.

Pour tester:

  • Dans votre environnement de développement, faites une copie du site et exécutez des tests de performances.
  • Faites du profilage là-bas.
  • Utilisez Failed REquest Tracking pour savoir quelles demandes échouent.

http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/

a un début là-bas. Cela peut vous donner un indice au cas où les problèmes seraient plus - hm - "catégorisables".

Je conserverais également des journaux de performances à plus long terme. Attention à votre IO (secondes/lecture, secondes/écriture sont à peu près les seules pertinentes). Tout le reste est IO sage trop vague - mais une fois que votre IO commence à prendre plus de temps que prévu, les disques prennent du retard.

J'exclurais un problème de configuration à ce stade - au moins comme indicateur principal. Quelque chose utilise vos ressources W3p, vous devez maintenant découvrir de quoi il s'agit.

En général, ce n'est pas un serveur que j'aimerais avoir physique - il est si petit, cela n'a aucun sens à mon humble avis d'y avoir une machine. Le virtuel serait mieux;)

5
TomTom

Vous pouvez essayer d'utiliser un programme appelé Process Explorer pour surveiller les threads individuels exécutés sous le processus w3wp. Il devrait vous permettre de voir quel fil est à l'origine de tous les dégâts.

4
Joe Phillips

J'ai eu beaucoup de chance en utilisant l'outil de diagnostic de débogage de Microsoft pour vider mon processus w3wp, puis vérifier les threads et les traces de pile pour les choses qui se bloquaient. Il vous indiquera même la page demandée qui a engendré le fil qui est SUPER Nice.

http://www.Microsoft.com/en-us/download/details.aspx?id=26798

3
jocull

Je suis d'accord avec TomTom sur toute la ligne, en particulier pour obtenir un meilleur kilométrage d'un virtuel à ce stade. Déboguer/profiler localement pour réduire le problème est la bonne chose à faire.

Je vais mettre mon chapeau et ma cape Karnak The Magnificent et demander la première enveloppe. Ram Rebellion. Qu'obtenez-vous lorsque vous mettez le système d'exploitation, ASP.NET et un SQL Server Express gourmand en 1 Go.

Je crois que votre problème est que SQL Server Express tire tous les RAM pour un pool de tampons et tarde à le libérer. Voir http://support.Microsoft.com/kb/32136 pour plus d'informations. En outre, IIS possède un cache par défaut de 256 Mo que vous devrez peut-être modifier ( https://stackoverflow.com/questions/ 2853135/control-asp-net-output-cache-memory-use ). Debug Diagnostics est un excellent outil pour résoudre ce problème (ok, probablement un marteau).

http://technet.Microsoft.com/en-us/library/bb742546.aspx est un article assez décent à regarder. http://social.technet.Microsoft.com/forums/en-US/sharepointadmin/thread/706c653a-16b0-4696-85ee-9ae3552a582e indique que le recyclage du pool d'applications est devenu un autre problème possible.

1
Larry Smithmier

Utilisez le compteur "Processus" de Perfmon pour voir les attributs individuels du processus w3wp.exe. Combien de temps CPU pour le processus de travail est le temps du noyau? Des temps de noyau élevés pourraient indiquer une pagination, mais vous dites que vous n'êtes pas convaincu. D'autres possibilités sont les pilotes duff. Le processus de travail a 23 threads actifs, ce qui est bien, mais que font-ils? Essayez ProcessExplorer de SysInternals pour creuser un peu plus; vous pouvez également voir quelles connexions TCP/IP sont en jeu. Je n'ai pas utilisé SQL Express, mais a-t-il des paramètres de réglage de la mémoire, comme son grand frère. SQL affame-t-il IIS de mémoire, provoquant une pagination excessive?

1
Simon Catlin

Il n'est peut-être pas totalement lié, mais vérifiez si vous utilisez NOLOCK dans vos requêtes. Cela pourrait aider dans le cas des délais d'expiration SQL.

0
Rodrigo Hahn