MensajeSon dos cosas diferentes. El proceso se recicla cuando la memoria 
utilizada por el proceso aspnet_wp.exe supera un límite preestablecido. Un 
OutOfMemoryException ocurre cuando una asignación de memoria falla debido a que 
no existe suficiente memoria disponible para satisfacerla. Cualquiera de estos 
eventos puede ocurrir sin la existencia del otro. Esto se puede ver con un 
ejemplo sencillo. Crea un web form con dos botones, agregando los siguientes 
handlers respectivamente.

protected void Button1_Click ( object sender, EventArgs e )
{
    byte [ ] buffer = new byte[ int.MaxValue ];
}

private static ArrayList _items = new ArrayList( 1000 );

protected void Button2_Click ( object sender, EventArgs e )
{
    for ( int i = 0; i < _items.Capacity; ++i )
    {
        _items.Add( new byte[ 1000000 ] );
    }
}

El primer botón asigna una cantidad de memoria que el sistema no puede 
satisfacer y provoca un OutOfMemoryException. Sin embargo, como la memoria 
nunca llega a ser asignada, el proceso continúa su ejecución. En el ejemplo no 
agrego ningún tipo de manejo de errores, pero se podría agregar un catch y 
atrapar el OutOfMemoryException. Por supuesto, dependerá de las circunstancias 
si la aplicación puede recuperarse de este error. Cuando el runtime no puede 
satisfacer una asignación de memoria, automáticamente dispara un GC con la 
esperanza de liberar la memoria necesaria, que es lo que estás observando.

El segundo botón asigna bloques de memoria que si bien individualmente pueden 
ser satisfechos, eventualmente la memoria consumida eventualmente supera el 
límite establecido en machine.config, y el proceso se recicla. Los valores que 
elegí son suficientes para provocar esto en mi máquina de desarrollo, pero 
pueden variar de acuerdo a la cantidad de memoria RAM y los valores 
configurados en <processModel>.


Saludos,

Fernando Tubio
  ----- Original Message ----- 
  From: Pablo A. Allois 
  To: puntonet@mug.org.ar 
  Sent: Thursday, December 28, 2006 10:44 AM
  Subject: [puntonet] Consulta sobre Process recycling de aspnet_wp.exe


  Buenos dias señores,

          La consulta viene a raiz de que tengo un servidor en el que corren 
unos webservices en .net 1.0 que cuando llega a cierto punto de uso de memoria 
dispara la exception Systtem.OutOfMemoryException.

          Ya configure el processmodel del machine.config para que el 
aspnet_wp.exe se recicle ... pero cuando llega el momento en que se tiene que 
reciclar sale con un outofmemory y no se recicla.

          La pregunta es ... que puede estar pasando que no permite que se 
recicle el proceso ?

          El servidor es un windows 2000 server sp4 ... IIS 5.
          Corren aplicaciones .net y java.
          Tiene 2Gb de memoria.

   <processModel enable="true" timeout="Infinite"
              idleTimeout="1:00:00" shutdownTimeout="0:00:20" 
              requestLimit="Infinite" requestQueueLimit="5000" 
              restartQueueLimit="10" 
              memoryLimit="20" 
              webGarden="false" cpuMask="0xffffffff"
              userName="*****" password="******"
              logLevel="All" clientConnectedCheck="0:00:05"
              comAuthenticationLevel="Connect" 
comImpersonationLevel="Impersonate"
              responseRestartDeadlockInterval="00:03:00" 
responseDeadlockInterval="00:03:00" 
              maxWorkerThreads="100" maxIoThreads="100"
          />        

          Lo que noto es que al llegar al memorylimit el GC empieza a trabajar, 
y luego de intentar liberar dispara la exception de out of memory.

          Si pueden ser utiles, tengo un log de performance para pasar.


  Saludos!

Responder a