Tengo una situación extraña en un servidor de producción. La conexión para asp.net se pone en cola, pero la CPU solo está al 40%. Además, la base de datos funciona bien con un 30% de CPU.Asp.net aplicación lenta pero la CPU está al 40% máximo
Un poco más de la historia conforme a lo solicitado en los comentarios:
- En las horas pico los sitios recibe alrededor de 20.000 visitantes por hora.
- El sitio es una aplicación de formularios web ASP.NET con una gran cantidad de AJAX/Posts
- El sitio utiliza una gran cantidad de contenido generado por usuarios
- Medimos el rendimiento del sitio con un testpage que no golpeó la base de datos y los servicios web utilizados por el sitio. Esta página se sirve dentro de un segundo con carga normal. Donde se define la aplicación como lenta cuando la solicitud demora más de 4 segundos.
- De las mediciones podemos ver que el tiempo de conexión es rápido, pero el tiempo de procesamiento es grande.
- No podemos precisar la slowresponse la una única solicitud, el sitio funciona muy bien durante las horas normales, pero se pone lento durante las horas pico
- ocurrido un problema que el sitio estaba obligado CPU (aka funcionando al 100%), se arreglado que
- También tuvimos problemas con las excepciones al reiniciar el dominio de la aplicación, arreglamos que haga
- Durante las horas punta eche un vistazo a los contadores de rendimiento asp.net. Podemos ver el comportamiento de que tenemos 600 conexiones actuales con 500 conexiones en cola.
- En las horas punta de la CPU es de alrededor de 40% (lo que me hace el pienso que no es por CPU)
- la memoria física es de alrededor de 60% utilizado
- En las horas punta del DatabaseServer CPU es de alrededor de 30% (que me hace pensar que no está vinculado a la base de datos)
Mi conclusión es que algo más está impidiendo que el servidor maneje las solicitudes más rápido. Posibles sospechosos
- interbloqueos (syncblk sólo da una cerradura!)
- /S de disco (comprobado mediante sysinternals procesexplorer: 3.5 MB/s)
- La recolección de basura (10 ~ 15% durante los picos)
- E/S de red (tiempo de conexión aún bajo)
Para saber qué está haciendo el proceso creé en minivolcados.
Logré crear dos MemoryDumps con 20 segundos de diferencia. Esta es la salida de la primera:
!threadpool
CPU utilization 6%
Worker Thread: Total: 95 Running: 72 Idle: 23 MaxLimit: 200 MinLimit: 100
Work Request in Queue: 1
--------------------------------------
Number of Timers: 64
y la salida de la segunda:
!threadpool
CPU utilization 9%
Worker Thread: Total: 111 Running: 111 Idle: 0 MaxLimit: 200 MinLimit: 100
Work Request in Queue: 1589
Como se puede ver hay una gran cantidad de Solicitud de cola.
Pregunta 1: lo que significa que hay 1589 solicitudes en la cola. ¿Significa que algo está bloqueando?!
La lista de subprocesos contiene en su mayoría estas entradas: función desconocida: 6a2aa293 Contexto: 01cd1558 AsyncTimerCallbackCompletion TimerInfo @ 023a2cb0
Si os en profundidad con el AsyncTimerCallbackCompletion
!dumpheap -type TimerCallback
Entonces miro el objetos en el TimerCallback y la mayoría de ellos son de tipos:
System.Web.SessionState.SessionStateModule
System.Web.Caching.CacheCommon
Pregunta 2: ¿Tiene algún sentido que esos Objetos tengan un temporizador, y tanto? Debería prevenir esto ¿Y cómo?
Pregunta principal ¿Echo de menos algún problema obvio por el que estoy haciendo colas y no estoy maximizando la CPU?
Tuve éxito en hacer un crashdump durante un pico. Analizando con debugdiag me dio esta advertencia:
Detected possible blocking or leaked critical section at webengine!g_AppDomainLock owned by thread 65 in Hang Dump.dmp
Impact of this lock
25.00% of threads blocked
(Threads 11 20 29 30 31 32 33 39 40 41 42 74 75 76 77 78 79 80 81 82 83)
The following functions are trying to enter this critical section
webengine!GetAppDomain+c9
The following module(s) are involved with this critical section
\\?\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\webengine.dll from Microsoft Corporation
Una búsqueda rápida en Google no me da ningún resultado. ¿Alguien tiene una pista?
¿Has probado y medido la velocidad de Firebug? ver qué parte carga más tiempo ... luego comenzar desde allí. – Arief
Esto es extremadamente difícil de diagnosticar usando la información irregular que proporcionó. ¿Hay alguna razón por la que comenzaste mirando los vertederos? ¿Tu aplicación ASP.NET está fallando? Si es así, ¿por qué clasifica esto como un problema de rendimiento? –