Windows Azure Web sites Auto-Healing o Application Pool Recycling en IIS

Una de las configuraciones posibles en IIS (Internet Information Services) es establecer condiciones por las cuales un application pool debe reiniciarse:

IIS Recycling options

Recycling conditions

Debido a que en Windows Azure Web sites no tenemos acceso a la configuración del servidor web, como ocurre en el caso de Cloud Services con la ayuda de startups por ejemplo, el equipo de Windows Azure Web Sites nos ayuda incluyendo un nuevo elemento dentro de system.webServer llamado monitoring, al igual que en un post anterior se comentaba la posibilidad de activar la compresión dinámica en las peticiones. En el post del blog oficial sobre esta nueva característica nos cuentan posibles combinaciones con las que podemos trabajar.

Para este post he creado un pequeño ejemplo para comprobar que funciona correctamente y saber de dónde podemos recuperar el log que se comenta en el post oficial.

El código

El código es bastante simple, puesto que lo único que quiero es crear peticiones lentas para que salte el trigger que voy a configurar:

using System.Threading;
using System.Web.Mvc;

namespace AutoHealingWAWebSites.Controllers
{
    public class TestController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            Thread.Sleep(10000);
            return View();
        }

    }
}

Como se puede ver, en la acción lo único que hago es invocar al método Sleep para que genere un retardo de 10 segundos en devolver la vista solicitada.

Configuración

En cuanto a la configuración, se trata de un elemento que no es reconocido localmente (en un IIS, IIS Express, etcétera), llamado monitoring:

  <system.webServer>
    <monitoring>
      <triggers>
        <slowRequests timeTaken="00:00:10" count="2" timeInterval="00:02:00" />
      </triggers>
      <actions value="Recycle" />
    </monitoring>
</system.webServer>

Lo primero que hacemos es incluir el elemento monitoring dentro de system.webServer. Dentro de este apartado se ha añadido triggers, incluyendo uno llamado slowRequests, donde indicamos el tiempo que consideramos lento para una petición (timeTaken), el número de peticiones que deben cumplir este criterio (count) y por último el intervalo de tiempo durante el cuál se debe producir este hecho para llevar a cabo la acción de reciclado del pool (timeInterval).
Fuera de triggers, añadimos un segundo elemento llamado actions donde indicamos en este caso el valor Recycle.

Publicación

Una vez que hemos tenido en cuenta estos pasos, ya podemos desplegar nuestra solución en Windows Azure Web sites. Es muy importante tener en cuenta que esta característica sólo está disponible en el modo standard. Por lo que si intentáis acceder a un sitio con un modo free o shared se mostrará el siguiente error:

The page cannot be displayed because an internal server error has occurred.

Una vez configurado correctamente el web site, ya podemos lanzar un par de peticiones para que la condición se cumpla y el pool se recicle.

eventlog.xml

eventlog.xml se trata de un archivo alojado en la carpeta LogFiles del sitio. Para acceder a ella podemos utilizar un cliente FTP o el propio navegador, con la dirección y las credenciales indicadas en el dashboard.

FTP WA Web Sites

Una vez realizadas un par de pruebas con este ejemplo, podemos ver los eventos registrados:

<Events>
<Event>
<System>
<Provider Name="W3SVC-WP"/>
<EventID>2299</EventID>
<Level>3</Level>
<Task>0</Task>
<Keywords>Keywords</Keywords>
<TimeCreated SystemTime="10:02:31 AM"/>
<EventRecordID>1613814906</EventRecordID>
<Channel>Application</Channel>
<Computer>RD00155D3A08A6</Computer>
<Security/>
</System>
<EventData>
<Data>Worker Process  requested recycle due to 'Slow Requests' limit.</Data>
</EventData>
</Event>
<Event>
<System>
<Provider Name="W3SVC-WP"/>
<EventID>2299</EventID>
<Level>3</Level>
<Task>0</Task>
<Keywords>Keywords</Keywords>
<TimeCreated SystemTime="10:23:03 AM"/>
<EventRecordID>1615046765</EventRecordID>
<Channel>Application</Channel>
<Computer>RD00155D3A08A6</Computer>
<Security/>
</System>
<EventData>
<Data>Worker Process  requested recycle due to 'Slow Requests' limit.</Data>
</EventData>
</Event>
</Events>

Por otro lado, por lo que he podido leer en StackOverflow, hay sitios que están sufriendo reciclados del pool cuando tienen peticiones que tardan más de 30 segundos en finalizar en el modo standard. El equipo del producto aporta la siguiente solución en este hilo.

¡Saludos!