2011-05-10 11 views
15

Tenía un código en una aplicación ASP.NET que se ejecuta en Server 2008 R2 + IIS 7.5. Cada vez que cargaba una página en particular, se colgaba para siempre y enviaba IIS al 100% de uso de la CPU. Finalmente rastreé el problema.El desbordamiento de pila en .NET envía IIS al 100% de uso de la CPU, ¿por qué no StackOverflowException?

public string Comments 
{ 
    get { return this.Comments; } 
} 

Oops - debería haber sido return this.Photo.Comments. Entonces, mi pregunta es, ¿por qué .NET no generó una StackOverflowException, sino que dejó que IIS se ejecutara al 100% de CPU por mucho más tiempo del que debería haber tomado. En mi experiencia de programación con .NET, toma unos segundos o menos para obtener una StackOverflowException al hacer algo como lo anterior. Entonces, ¿cómo podría seguir funcionando durante casi 30 minutos en IIS?

+0

¿El proceso del trabajador tal vez murió y volvió a intentar la operación? Accidentalmente codifiqué un SO el otro día, y mató ASP.NET (Sharepoint en mi caso) bastante rápido. – leppie

+1

Dado que .net 4 optimiza la recursividad de cola, esto podría haberse reescrito en un bucle. Puede verificar esto mirando el IL. – Heinzi

+0

¿Esto es ASP.NET 2.0 o 4.0? – Kev

Respuesta

5

Es posible que el compilador JIT optimizado a cabo una llamada de método a YourClass::get_Comments() (que es lo que la IL se vería) y inlined el código con un jmp (o lo que sea el ensamblador x86 sería) bucle construir porque no había ningún valores que se transmiten. Solo un pensamiento.

Este antiguo artículo es digno de una mirada:.

Jit Optimizations: Inlining (II)

"Un ejemplo típico de una muy buena candidato para procesos en línea es una propiedad captador/definidor Estos son por lo general métodos muy pequeños que usualmente solo hacen una búsqueda de memoria o la almacenan, por lo que es generalmente un tamaño y velocidad ganados para alinearlos en ellos ".

Como es:

Writing High-Performance Managed Applications : A Primer - Managed Code and the CLR JIT

También reproduce esto con una simple aplicación de consola:

class Program 
{ 
    static void Main(string[] args) 
    { 
    MyClass mc = new MyClass(); 
    string s = mc.Comments; 
    } 
} 

public class MyClass 
{ 
    public string Comments 
    { 
    get { return this.Comments; } 
    } 
} 

En el modo de depuración con optimizaciones desactivadas consigo una pila excepción de desbordamiento lanzada. Al activar Jit Optimisations y compilar una versión de lanzamiento, la aplicación se ejecuta para siempre. Esto sugiere que probablemente haya sucedido la creación de un ciclo.

Esto también parece ser el caso con C# 2.0, 3.0 y 4.0.

+0

Esto tiene sentido, gracias. Probé el modo de depuración y, curiosamente, acaba de estrellar IIS y me dio un 503. De todos modos, problema resuelto. –

0

¿Esto sucede tanto en el desarrollo como en el lanzamiento?

Lo siento, no estoy seguro, pero aquí está mi especulación. En algún lugar, tiene configurado un reintento automático. Entonces el proceso de operación falla desde una StackOverflowException. En lugar de que el usuario reciba un mensaje, IIS reintenta con un nuevo proceso. Esto sigue y sigue y sigue. Y entonces los intentos repetidos se comen toda la CPU.

He intentado buscar un mecanismo de reintento automático que pueda dar cuenta de ello, pero hasta ahora no he tenido suerte, pero sabrá más sobre su configuración.

Otra comprobación que podría intentar es escribir algo que asigna una gran cantidad de memoria y ver si ocurre lo mismo con OutOfMemoryException. Si es así, es casi seguro que se trata de un reintento automático.

1

Intenté poner este código en una biblioteca de clase y ejecutarlo con una prueba unitaria.

Bloquea el agente de prueba MS con una excepción de desbordamiento de pila.

Lo que puede estar pasando es que está obteniendo una excepción de stackoverflow. Esto está bloqueando el grupo de aplicaciones. A continuación, IIS extrae una nueva copia del grupo de aplicaciones y se bloquea de nuevo ...

Compruebe su registro de eventos para el reciclaje/detención de grupos de aplicaciones.

Cuestiones relacionadas