¿Cómo puede saber qué está haciendo w3wp.exe? (o cómo diagnosticar un problema de rendimiento)

42

Tengo un problema de rendimiento en un sitio que hemos creado, y no estoy exactamente seguro de cómo comenzar a diagnosticarlo.

La breve descripción es: Tenemos un sitio muy pequeño ( http://hearablog.com ) con muy poco tráfico, en un servidor dedicado deficiente, la CPU siempre es muy alta, a veces se mantiene al 100% durante minutos, y w3wp.exe está tomando la mayor parte. Un escenario típico es que w3wp.exe toma el 60% y SQL Server toma aproximadamente el 30%. Nuestro DB también es bastante pequeño.

Descripción larga y más detalles:

  • El sitio está alojado en un servidor muy malo por Cari.Net. Desde el principio, tuvimos la sensación de que el servidor no se comportaba correctamente, ya que algunas cosas tomarían demasiado tiempo, por lo que esto podría ser un problema de configuración desde el principio. También puede ser que estemos obteniendo un servidor virtual mientras se supone que tenemos uno dedicado, aunque no tenemos evidencia que indique esto, excepto por el hecho de que el servidor tiende a ser bastante lento.

  • El servidor es Windows 2008 Standard de 64 bits, con SQL 2008 Express

  • El hardware es un Celeron 2.80 GHz, 1Gb RAM

  • El sitio web está desarrollado en ASP.Net MVC, utilizando Entity Framework para el acceso a datos.

  • Ahora, este es un hardware bastante malo, pero he tenido otros servidores con estos tipos, con HW equivalente (o peor), y el rendimiento es mucho mejor que este. Dicho esto, los otros servidores tienen W2003 y SQL2005, y estoy usando ASP.Net "WebForms" 2.0, sin MVC, sin LINQ, sin EF; así que no estoy seguro de si ir a 2008 / lo demás significa que se espera una gran penalización de rendimiento.

  • Estoy sirviendo archivos MP3 (5-20 Mb) regularmente, lo cual es una carga un poco inusual, ¿tal vez está causando algún tipo de problema?
    ¿Causaría eso que w3wp use mucha CPU?

  • El uso del disco parece muy bajo. La memoria suele rondar el 90%, pero el uso del disco parece indicar que no está paginando demasiado.

  • Recibo toneladas de correos electrónicos todos los días sobre los tiempos de espera de SQL, para consultas que toman más de 30 segundos, aunque todas nuestras consultas son bastante sencillas (o deberían serlo, pero EF puede estar arruinándolo).

Así es como se ve el monitor de recursos en uno de estos "sprints" de 100% de CPU, en caso de que haya algo útil allí.

texto alternativo

Y una instantánea de algunos contadores de rendimiento: texto alternativo

Ahora, lo que me confunde mucho es que el uso de CPU de w3wp es tan alto. Realmente no debería estar haciendo mucho ... Así que mis preguntas son ...

  • ¿Hay alguna forma de descubrir "qué" está haciendo? ¿Quizás incluso perfilarlo?
  • ¿Algún contador de rendimiento que debería mirar?
  • ¿Es de esperar esto dada esta configuración de hardware / software?
  • ¿Esto podría deberse a algún tipo de falla de configuración? ¿Dónde comenzaría a buscar?

Muchas gracias.
Daniel Magliola

Daniel Magliola
fuente

Respuestas:

42

También puede usar la interfaz de usuario de Procesos de trabajo dentro del Administrador de IIS e inspeccionar las solicitudes que se están ejecutando actualmente y ver dónde se estancan si las hay. Abra el Administrador de IIS-> Haga clic en el servidor en el árbol-> Haga doble clic en el icono Procesos de trabajo-> Haga doble clic en el Proceso de trabajo que consume CPU para ver las solicitudes que se están ejecutando actualmente en tiempo real para que pueda ver qué módulo está tomando tiempo.

También considere usar el seguimiento de solicitudes fallidas para rastrear parte del tiempo por solicitud para ver dónde tardan mucho tiempo.

Carlos Aguilar Mares
fuente
2
Esto es prometedor, en realidad suena EXACTAMENTE como lo que quiero ver, pero en realidad esas pantallas se muestran vacías. Aparentemente, solo muestra solicitudes que demoran más de un segundo, según el gran cartel en la parte superior, y ninguna de nuestras solicitudes es evidente, porque la lista está vacía. ¿Alguna idea sobre cómo hacer que muestre más solicitudes? ¿Cómo bajar el filtro 1s? ¡Gracias!
Daniel Magliola
1
Puede escribir 0 en el filtro y hacer clic en Ir, que lo establecerá en 0 segundos. Además, puede ejecutar desde un símbolo del sistema elevado "% windir% \ system32 \ inetsrv \ appcmd.exe lista de solicitudes"
Carlos Aguilar Mares
1
Muchas gracias Carlos! Esto es lo que terminé haciendo para encontrar la única solicitud (un cron que tenemos) que estaba matando a mi servidor cada 5 minutos (tardó 3,5 minutos en ejecutarse, por lo que estaba casi constantemente al 100% de CPU). ¡¡¡Gracias!!!
Daniel Magliola
1
Esta interfaz de usuario me dijo a qué URL se había accedido; desafortunadamente es una POST a un servicio web asmx, y esos datos no están disponibles. (headbang)
Ross Presser
5

Ok, para comenzar: el servidor es REALMENTE malo. Pero DEBE ser suficiente.

  • Para la virtualización, verifique sus controladores. No conozco ninguna plataforma de virutalización que oculte la CPU (y creo que alguien pone un hyper-v o esx en un celeron) pero los controladores para el disco, etc. son una indicación.

  • La CPU no debería ser tan alta. Lamentablemente, con esta RAM, estás bastante tostado: si comienzas a agregar un perfilador, prácticamente volarás la memoria que tienes.

Me gustaría:

  • Verifique los registros para ver si hay cosas ejecutándose en este momento.
  • Actualice el sistema operativo a 2008 R2: hay MUCHA más información disponible allí.

Para las pruebas:

  • En su entorno de desarrollo, haga una copia del sitio y ejecute algunas pruebas de rendimiento.
  • Hacer perfiles allí.
  • Use Failed REquest Tracking para averiguar qué solicitudes fallan.

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

tiene algo de comienzo allí. Esto puede darle una pista en caso de que los problemas sean más - hm - "categorizables".

También mantendría registros de rendimiento a largo plazo. Tenga cuidado con su IO (segundos / lectura, segundos / escritura son prácticamente los únicos relevantes). Todo lo demás es demasiado inteligente, pero una vez que su IO comienza a tardar más de lo debido, los discos se quedan atrás.

Descartaría un problema de configuración en este punto, al menos como indicador principal. Algo agota sus recursos W3p, ahora necesita saber de qué se trata.

En general, este no es un servidor que me encantaría tener físico, es tan pequeño que no tiene sentido en mi humilde opinión tener una máquina allí. Virtual sería mejor;)

TomTom
fuente
Muchas gracias por su respuesta. algunas preguntas: ¿Qué registros verificaría si hay cosas ejecutándose en este momento? (lo siento si esta es una pregunta para novatos) - Actualice el sistema operativo: Podríamos intentarlo, pero me temo que puede romper cosas, tal vez, ¿qué tan seguro es esto? - Entorno de desarrollo: el problema es que en mi entorno de desarrollo funciona bien. La CPU es insignificante, las solicitudes no fallan, etc.
Daniel Magliola
En cuanto a los registros de E / S: acabo de agregar los contadores que menciona, y todos están en 0 mientras la CPU está alta. Acabo de agregar una captura de pantalla de algunos contadores de rendimiento que estoy viendo. Sé que una instantánea no cuenta toda la historia, pero esos valores tienden a ser bastante estables. ¿Crees que el número de conexiones actuales (que no tengo explicación) podría ser un problema? ¿Alguna idea sobre cómo averiguar qué solicitan / hacen esas conexiones? ¿Algún otro contador que creas que puede ser útil para diagnosticar algo como esto?
Daniel Magliola
Bueno, R2 es bastante seguro. Actualicé todo y nunca tuve un problema. De todos modos ... este es un problema de CPU y clavarlo puede ser terrible, especialmente dado que no tienes suficiente RAM para instalar un generador de perfiles. Realmente intentaría una reinstalación completa. Sí, apesta, pero significa que podría instalar R2 nuevo y ver si el problema persiste. Lo malo es que no tiene un sistema de reserva, por lo que no puede identificar si el problema es "local" o más general. Alternativamente: pare IIS, limpie todas las carpetas temporales en uso, también
TomTom
para compilar y ver qué sucede cuando reinicias. Con R2 puede ver si / qué archivos mantiene IIS abierto. ¿Es esto local para una aplicación web, o también está allí si se detienen todos los sitios web? Lo siguiente que debe intentar: apague todos los sitios y descubra cuál rompe las cosas.
TomTom
Finalmente, el problema con los servidores virtuales es que, por lo que he encontrado, terminamos pagando más o lo mismo por el mismo hardware, además, la factura del ancho de banda es asesina (tenga en cuenta que servimos archivos de audio). Nos mudaremos a un servidor más grande si es necesario, pero, sinceramente, con el tráfico que tenemos, debe haber algún problema, no deberíamos estar usando el 100% de la CPU nunca ...
Daniel Magliola
4

Podría intentar usar un programa llamado Process Explorer para monitorear subprocesos individuales que se ejecutan bajo el proceso w3wp. Debería permitirle ver qué hilo está causando todo el daño.

Joe Phillips
fuente
3

Tuve mucha suerte usando la herramienta de diagnóstico de depuración de Microsoft para volcar mi proceso w3wp y luego revisar los subprocesos y los rastros de la pila de las cosas que se estaban bloqueando. Incluso te dirá la página solicitada que generó el hilo que es SUPER agradable .

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

jocull
fuente
1

Estoy de acuerdo con TomTom en el futuro, especialmente sobre cómo obtener un mejor kilometraje de un Virtual en este momento. La depuración / creación de perfiles localmente para reducir el problema es lo correcto.

Voy a ponerme el sombrero y la capa Karnak The Magnificent y pediré el primer sobre. Rebelión Ram. ¿Qué obtienes cuando pones el sistema operativo, ASP.NET y un codicioso SQL Server Express en 1GB?

Creo que su problema es que SQL Server Express está utilizando toda la RAM disponible para un grupo de búferes y tarda en liberarlo. Consulte http://support.microsoft.com/kb/321363 para obtener más información. Además, IIS tiene una memoria caché predeterminada de 256 MB que puede necesitar ajustar ( https://stackoverflow.com/questions/2853135/controlling-asp-net-output-cache-memory-usage ). Debug Diagnostics es una gran herramienta para solucionar este problema (bueno, probablemente un mazo).

http://technet.microsoft.com/en-us/library/bb742546.aspx es un artículo bastante decente para mirar. http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/706c653a-16b0-4696-85ee-9ae3552a582e señala que el reciclaje del grupo de aplicaciones se volvió loco como otro posible problema.

Larry Smithmier
fuente
1

Utilice el contador "Proceso" de Perfmon para ver los atributos individuales del proceso w3wp.exe. ¿Cuánto tiempo de CPU para el proceso de trabajo es el tiempo del kernel? Los tiempos de kernel altos podrían ser indicativos de paginación, pero usted dice que no está convencido. Otras posibilidades son los conductores duff. El proceso de trabajo tiene 23 hilos activos, lo cual es bueno, pero ¿qué están haciendo? Prueba el ProcessExplorer de SysInternals para investigar un poco más; También puede ver qué conexiones TCP / IP están en juego. No he usado SQL Express, pero tiene parámetros de ajuste de memoria, como su hermano mayor. ¿SQL está privando a IIS de memoria, causando paginación excesiva?

Simon Catlin
fuente
Veamos si estoy haciendo esto bien ... Agregué el% de tiempo de procesador y el% de contadores de tiempo de usuario, ambos para el proceso w3wp, y ambos coinciden perfectamente todo el tiempo. ¿Eso significa que no hay tiempo de kernel, o estoy mirando esto de la manera incorrecta? (lo siento, soy un novato en esto)
Daniel Magliola
0

Puede que no esté totalmente relacionado, pero verifique si está usando NOLOCK en sus consultas. Podría ayudar en el caso de los tiempos de espera de SQL.

Rodrigo Hahn
fuente