¿Por qué debo definir "debug=false" en web.config?, Parte II

En la primera parte de este artículo revisamos parte del impacto de definir debug=”true” en nuestro archivo de configuración web.config. Dentro de lo estudiado, abarcamos la revisión de la carpeta temporal de asp.net y cómo se generan los archivos de código de las páginas y controles, para finalizar con la generación de los ensamblados que resultan de la compilación.


En ésta oportunidad cubriremos cómo actúa asp.net para manejar las modificaciones de los archivos que ya están compilados. Excluiremos por motivos obvios las modificaciones a archivos de configuración, como de la carpeta bin o configuración de IIS.


Antes de entrar de lleno en la modificación, revisemos todas las opciones disponibles para la compilación en asp.net 1.1.

Opciones de compilación 

En la primera parte, utilizamos elemento de compilación del archivo web.config que es creado por defecto:

<compilation defaultLanguage=”c#” debug=”false”    />
 

Sin embargo, existe una cantidad importante de opciones disponibles para la compilación. Veamos uno más completo para VB.NET y C# respectivamente.

<compilation defaultLanguage=”VB” debug=”true”
numRecompilesBeforeAppRestart=”?cantidad” explicit=”true|false” strict=”true|false”
batch=”true|false” batchtimeout=”?seconds” maxBatchGeneratedFileSize=”?kilobytes

maxBatchSize =”?cantidad” tempDirectory=”?ruta”>
</
compilation>

<
compilation defaultLanguage=”c#” debug=”true”
numRecompilesBeforeAppRestart
=”?cantidad”
batch=”true|false” batchtimeout=”?seconds”
maxBatchGeneratedFileSize=”?kilobytes”
maxBatchSize=”?cantidad” tempDirectory=”?ruta”>
</compilation>

 


El significado de las opciones es a veces intuitivo y otras no. Veamos una por una, excluyendo las dos primeras que ya conocemos:




  • numRecompilesBeforeAppRestart: Se refiere a la cantidad de re-compilaciones dinámicas que se realizan antes de que se produzca un reinicio de la aplicación. Es trascendental aclarar que como re-compilaciones se refiere a cambios en los archivos de páginas, controles y otros recursos, dentro de los cuales definitivamente NO se incluyen los archivos de configuración (web.config, machine.config, etc.), los ensamblados de la carpeta bin y modificaciones al directorio virtual o aplicación web. El valor por defecto es 15. Aunque la documentación no lo dice, sí funciona para aspnet 1.1 (ver más).



  • explicit y strict: Las mismas opciones disponibles para los desarrolladores VB. Para C# no tienen efecto.



  • batch: Si es verdadero, se compilan los archivos agrupados de la mejor forma posible (como hemos visto hasta ahora). En caso de ser falso, se compila un archivo por página o control. No confundir con debug=false. En este caso se compila realizando las optimizaciones apropiadas al código.


  • batchtimeout: tiempo en segundos que se dará para que alcance a compilarse un grupo de archivos. En caso de demorar más tiempo del especificado, para ese requerimiento se cambia la modalidad a por archivo.


  • maxBatchGeneratedFileSize:  Según la ayuda, especifica el tamaño máximo (en KB) de los archivos de código fuente generados en cada compilación por lotes (batch). Me surge la siguiente duda. Si el archivo de código generado de una página de mi sitio es más grande, ¿no lo va a compilar?


  • maxBatchSize: Cantidad de archivos que incluirá como máximo en cada ensamblado.


  • tempDirectory: Directorio donde se copiarán los archivos para la compilación.
Reutilización de ensamblados

Algo que no habíamos comentado antes y que es muy importante. El resultado de la compilación (ensamblados) no se ve afectado por reinicios de proceso, de servicio o de servidor. Cuando se procesa un requerimiento se revisa si el recurso (aspx, ascx) está compilado en el directorio temporal, y en caso de ser así, se utiliza el ensamblado sin consumir tiempo y recursos compilando nuevamente.


La siguiente imagen fue capturada de mi equipo el 10 de Mayo después de hacer un cambio a un archivo y podrán observar que se han mantenido los otros ensamblados con fecha 07 de Mayo.



Si notan con cuidado, verán un archivo que tiene como extensión DELETE. Pasemos a revisar como ocurre eso.

Modificaciones de archivos

Para no distorsionar cualquier prueba, he limpiado mi carpeta temporal por lo que ahora cuento con archivos generados el día de hoy (22 de Mayo). La siguiente imagen muestra el estado inicial de la carpeta temporal.



Para complementar lo anterior, se despliega ahora una imagen con las DLLs cargadas en memoria para el proceso aspnet_wp.exe (worker process de IIS 5.1 de Windows XP 32 bits). Para monitorear procesos, pueden utilizar las herramientas disponibles de SysInternals.



Después de realizar una modificación en el archivo WebForm1.aspx, y volver a ejecutarlo, hacer otra modificación y volver a ejecutarlo, se pueden observar los siguientes cambios en la carpeta temporal y en el proceso aspnet_wp.exe.




En la primera modificación se generó un ensamblado para almacenar el resultado de la compilación de este archivo modificado (wdjnsrvz.dll). Como luego se volvió a modificar el mismo, el primer compilado (wdjnsrvz.dll) ya no era necesario y se generó uno nuevo (5jbqtzyx.dll). El ensamblado que ya no se utiliza, se marca con la extensión .delete.


Adicionalmente, en el proceso aspnet_wp.exe se continúan cargando ensamblados a medida que se van requiriendo páginas. Recordemos que los ensamblados NO pueden ser descargados de un proceso, a menos que se descargue el dominio. Para el caso de una aplicación web, el dominio es la misma aplicación, lo que hará que no se descarguen los ensamblados hasta que la aplicación se recicle.


Limpiamos nuevamente nuestra carpeta temporal, definimos debug=”true” y procedemos a modificar y forzar re-compilaciones.

Después de muchas modificaciones

Como era de esperarse, después de muchos cambios, la situación en el directorio temporal y el proceso no es de las mejores. Haz click en las imágenes para agrandar.








Una vez que modificamos los archivos más de las veces especificadas en numRecompilesBeforeAppRestart, el worker process (aspnet_wp.exe) se recicla, como era esperado.


Después del reciclado del proceso, este es el panorama en el directorio temporal y el proceso. Haz click en las imágenes para agrandar.







Con debug=”false”

Si repitiésemos todo los pasos anteriores, pero con debug=”false”, el resultado sería como el de la siguientes imágenes. Podrán ver que hay una menor cantidad de archivos, optimizados durante la compilación.














Si se revisan con detalle las imágenes anteriores, hay 4 ensamblados que no han sido modificados desde un poco más de 1 hora. Estos ensamblados son los que contienen los archivos Global.asax, WebUserControl2.ascx, WebUserControl1.ascx y WebForm5.aspx, que corresponden a los 4 archivos que no se han modificado en estas pruebas. Sólo se modificaron los WebFormN.aspx, con N desde 1 a 4.


A propósito, hemos comprobado que la opción numRecompilesBeforeAppRestart  sí funciona en asp.net 1.1.

¿Cuál es el valor adecuado para numRecompilesBeforeAppRestart?

Lamentablemente esta no es una pregunta sencilla de responder. En éste KB (http://support.microsoft.com/kb/319947/en-us) recomiendan definir un valor mayor la cantidad de archivos que actualmente se copian. Me imagino que hay algunos escenarios donde una recomendación de ese tipo hace sentido, pero en mi experiencia, la cantidad de archivos a subir a producción siempre es variable.

Otra implicancia de alto impacto

Existe una posibilidad de que una página pueda correr indefinidamente si  debug=”true”. De acuerdo al documento ASP.NET Performance Monitoring, and When to Alert Administrators, si está en true, el valor de <httpRuntime executionTimeout=/> y Server.ScriptTimeout serán ignorados, y dependerá del valor de <processModel responseDeadlockInterval=/> si se presenta la condición o no.

 

Espero en una tercera entrega, poder mostrar optimizaciones a nivel de código. Espero que ya estés medio convencido.


Desde Quito, Ecuador
Patrick

70 Replies to “¿Por qué debo definir "debug=false" en web.config?, Parte II”

  1. Señor, cómo se puede acceder por código y saber si compilation debug es true o false ?

    Saludos.

  2. Espinete,

    mira, no es muy elegante, pero funciona.

    using System.Reflection;

    bool b;

    object o = System.Configuration.ConfigurationSettings.GetConfig(“system.web/compilation”);

    b = (bool)o.GetType().InvokeMember(“_debug”, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, o, null);

    b será verdadero o falso en dependiencia del valor de la configuración.

    Saludos,
    Patrick

  3. Buenas!…. necesito saber COMO podemos guardar el TRACE de la compilacion en nuestro disco,,,

    Me dijeron q habia una configuracion en especial que hacia posible esto… desde la Web Config…

    Le agradeceria su Rta…..

    Gracias

  4. Para asp.net con frk 3.5 y el nuevo frk 4.0 se aplica igual todo lo que comenta en este gran artículo ???

    gracias !!!

  5. Espinete,

    dado que el framework 4.0 aun no es liberado, no he hecho pruebas sobre éste.

    Para 3.5 o anteriores, hay ciertas cosas que no aplican, principalmente porque desde 2.0 en adelante, puedes publicar (publish) tus sitios con visual studio. Esto hará que tu sitio ya se copie compilado. Si no utilizas la publicación de visual studio, entiendo que las reglas son las mismas que antes.

    Saludos

  6. Hello! Quick question that’s totally off topic. Do you know how to make your site mobile friendly? My website looks weird when browsing from my iphone4. I’m trying
    to find a theme or plugin that might be able to fix this issue.

    If you have any recommendations, please share. Cheers!

  7. You really make it seem so easy with your presentation but I find this matter to
    be actually something which I think I would never understand.
    It seems too complicated and extremely broad for me. I’m looking forward for your next post, I will try to get the hang of it!

  8. Howdy! Someone in my Facebook group shared this site with
    us so I came to look it over. I’m definitely loving the information. I’m book-marking and will be tweeting this to my followers!
    Terrific blog and superb design.

  9. 描写太阳的好词精选:

    红日欲出红日未出红日初升红日喷薄红日艳艳旭日初露旭日初升旭日东升旭日临窗

    旭日将升旭日当空晓日初升朝阳初升朝阳灿灿朝阳普照朝阳火红太阳升高太阳高起

    日出旭旭日出东山日出三竿日上三竿日高三丈三竿日出日色东升日头露脸火轮升腾

    火球高升为乌飞升一轮红日一轮朝日一轮旭日喷薄欲出喷薄而出徐徐上升红日高悬

    红日高照红日当空赤日当空赤日当天赤日炎炎赤日烫人丽日当空丽日高照烈日当空

    烈日当头烈日炎炎烈日灼烈烈日灼人日头正顶日已中天日头正毒日轮当午日当正午

    日悬高天日悬中天日正中天日色过午日头炽热明日高挂太阳高照太阳毒辣骄阳满天

    太阳当空艳阳当空艳阳骄骄艳阳高照艳阳普照春阳灿灿秋阳明丽秋阳明媚秋阳高照

    高悬天空太阳偏午雨后晴阳太阳平西太阳西斜太阳偏西太阳西沉太阳西坠太阳入山

    太阳落山太阳西下太阳落坡夕阳正美夕阳如血夕阳如丹夕阳如火太阳嫣红夕阳欲坠

    夕阳将坠夕阳将落夕阳西坠夕阳西照夕阳将沉夕阳斜照夕阳映照夕阳残照夕阳晚照

    描写太阳的好句好段精选:

    1、日出,自然界中最雄伟壮丽的景色,千百年来被古往今来的诗人、作家赞颂过许多次,可我却忍不住还要写它,因为日出的美丽,是永远也说不完,道不尽的。

    2、落日,只剩下最后的一点残阳。秋风飒爽,菊开飘香,树下饮酒愁更愁。落日剩残阳,残阳更似血,余光辉波荡心湖,心湖更映阳,阳须血下忧愁心,梦想桃花源。

    3、几分钟过去了,吹来一阵大风,太阳借着东风,猛地从乌云里钻了出来,那一瞬间,金色的阳光洒在了黄山这一片宝地上,映地我们的脸也金灿灿的。乌云也好像在害怕太阳的光芒,躲得远远的。本来灰蒙蒙的天空,霎时间变得灿烂无比。

    4、东边天上打上了一层淡淡的一丝微红。这红色渐渐变深,慢慢扩大,我已感觉到太阳即将到来。原来,那微红是红霞,是太阳来临的前兆。太阳好象在跟我开玩笑似的,趁我一不注意时,一下子溜了出来,出现在众多高楼大厦中,只能隐隐约约看见它的圆脸蛋。此时,太阳变成了淡淡的桃红色,下半边变脸几乎与天连成一片,根本分辨不出哪儿是太阳哪儿是天。太阳就像一只失去自由的小鸟,被牢牢地栓住,缓缓向上“飞”,就算使出吃奶的劲儿,也只能“飞”高一点儿。一瞬间,这只“鸟”又“飞”高了一点,变成了橘黄色,变得越来越亮,但周围却没有任何光芒。又过了一会儿,太阳已经接近金黄色,天也变红了些。

    5、当太阳升起一大半时,周围的事物完全被照亮,此时东方全是红的,像蓝天燃起了大火,烧红了半边天,十分壮观,此时,再伟大的人看到这幅景象,都会意识到自己的渺小。

    6、穿过手指间的缝隙,“窥视”灿烂的太阳,不禁沉醉在它那耀眼的光芒。它所释放出的每一寸阳光,额哦都想拥有。躺在摇椅上,不知不觉睡着了,可阳光似乎还在我的梦里。忘却了城市的繁杂,我安心的享受阳光。

    7、橙红的圆盘旁,拖着淡淡红晕。厚重的云层也被烧成了红色,天空也镶嵌上了余晖的印记。然后在树梢头停那么一会儿,还可以看着它散发出的一缕缕余晖,最后无声落幕。

    8、不知是有意还是无意,每日都看到落日余辉洒在大地上,然后消失殆尽。每日如此!不管是我停下手中飞舞的笔,望向窗外时,不管是在青葱的林荫里漫步时,还是在球场上汗如雨下时,眼角轻瞥,便能看见落日,看着落日的余晖拂过脸庞。

    9、不出半小时,夕阳就挨上了水面,橘红色的余光照得湖水不停的闪烁。又过了一会儿,落日开始有些退缩了,她收敛了自己华丽的衣裳,变得越发暗淡下来,涨的通红的脸蛋也恢复了原色,又似乎是一位慈祥的老人。

    10、太阳渐渐落下去了,把身边的云染成了紫色、红色、淡粉红色、橙色,真是美丽极了。过了几分钟我再看太阳,发现太阳像个害羞的小姑娘已经躲到云朵做成的家里去了,最后,一点点阳光全不见了。我自言自语的说:太阳又到地球的另一个地方,给那里的人们带去温暖了。

    11、头顶上的云是蔚蓝蔚蓝色的,脚下还是灰蒙蒙的云海,我们站在云海之上,真有种神仙的感觉。再看看我们的周围,早已是人山人海,人声鼎沸。渐渐地,东方的太阳已升起了好高,顿时光芒万丈,好一幅美丽的图画。

    12、我总爱透过指缝看太阳,看者它把自己的光辉撒满大地。从中午到晚上,在空中划过一条完美的弧线。妈妈却总是忙个不停,不一会儿,把阳台上的衣架挂满棉袄,雪地鞋也在角落排好了队。妈妈说要给它们一个“日光浴”,并说要让太阳给棉袄们洒上奇特的“香水”。我挂出一个大问号,妈妈只是神秘一笑,说:“太阳落山的时候你就知道了!”

    13、笑脸是一轮温馨的太阳,问候是一缕关爱的阳光,那真诚的友谊和关爱是人生中刻骨铭心的难忘。那阳光般的真诚,阳光般的炙热,阳光般友谊,阳光般的爱恋,让每一个心灵都深情的向往。那带着牵挂的祝福,会为你疗治心灵的创伤,那带着微笑的问候,会送给你一片心灵的阳光。

    14、阳光灿烂的日子是幸福的,阳光灿烂的日子是充实的,阳光灿烂的日子是畅怀的。但这样的日子并不是每天都存在,它是由自己的心情而决定的。

    15、仰望天际,西半天还是湛蓝色时,东面的空中已出现了丝丝光亮。远处房屋的背后隐着一道浅红色的光彩。待我取来纸笔,决定记下这一美景时,那道浅红的光彩已不复存在,取而代之的是一抹朱红中透着金光的云霞。原本丝丝的光亮趋走了另外一头的那片黑暗,使得整个儿天穹都亮了起来。虽然太阳还未抛头露面,但它一定已从东海岸边跃出了海平线――因为日光照在纸上泛出了淡淡的红光。[标签:标题]

Leave a Reply

Your email address will not be published. Required fields are marked *