¿Qué es el Web Garden y cuándo debo utilizarlo?
En varias ocasiones me han hecho esa pregunta. La primera parte de la pregunta es fácil de responder, pero la segunda parte es mucho más compleja.
¿Qué es Web Garden?
No debemos confundirlo con Web Farm. Una Web Farm son varios servidores que sirven un mismo Sitio Web y el Web Garden es permitir a un Application Pool tener más de un working process (w3wp.exe).
¿Cuándo debo utilizarlo?
Leyendo esta breve descripción parece que utilizar Web Garden es una buena idea, porque permites tener más procesos ejecutando la misma aplicación, lo que daría a procesar más peticiones…
Tras este razonamiento debo decir que mi recomendación sería que en la mayor parte de los casos no debería utilizarse. A pesar de las ventajas que tiene, el que haya varios procesos para el mismo Application Pool puede provocar problemas de rendimiento, ya que se están duplicando las aplicaciones que están alojadas en el Application Pool tantas veces como working process haya.
Además, no se puede saber qué proceso recibirá siguiente petición y no puede utilzarse con aplicaciones que usen InProc como Session State, ya que cada working process tiene sus propias sesiones.
Si lo que queremos es aumentar el rendimiento de la aplicación primero deberíamos considerar el aumentar el número de threads que pueden ejecutarse en la aplicación siguiendo las instrucciones que se detallan en este artículo https://support.microsoft.com/kb/821268.
Este es un ejemplo de cómo quedaría en la configuración de la aplicación:
<system.web>
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
Después de este panorama tan negativo, podemos pensar que no tiene sentido que exista esta opción en el IIS. Pues sí que hay razones por las que podemos utilizarlo.
Como por ejemplo que exista un proceso o ejecución de script que pueda bloquear al proceso. Si tenemos varios procesos tan sólo quedaría afectado uno de ellos. Aunque tampoco es la mejor de las razones para usar Web Garden. Lo primero sería encontrar el motivo por el que se bloquea ese proceso o script. Si tenemos una ejecución muy pesada, es mejor crear una petición asíncrona con esa petición de forma que no afecte a la ejecución del hilo del proceso.
Otro motivo puede ser que si en una arquitectura de 32 bits el consumo de memoria está cercano al límite de 2 GB y no existe la opción de recodificar la aplicación, el dividir las peticiones en varios procesos puede hacer que ninguno de ellos llegue a esos 2 GB de memoria. Esto también se podría solucionar migrando la aplicación a una arquitectura de 64 bits.
¿Cómo configurarlo?
Aquí os dejo los enlaces para configurar los Web Garden según el IIS:
- IIS 6: https://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/659f2e2c-a58b-4770-833b-df96cabe569e.mspx?mfr=true
- IIS 7.x: Cambiando el valor de
maxProcesses
que del Application Pool correspondiente. En este enlace se describen las propiedades del Application Pool en IIS 7.x: https://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/processModel
Resumen
A modo de resumen, os diría que en general no hay que utilizar el Web Garden, que primero se estudie muy bien qué queremos conseguir utilizándolo y viendo si es la mejor opción.
Espero que os sirva de ayuda
- José Ortega Gutiérrez