Hola Angel, Ahí estoy haciendo algunas pruebas. Básicamente estaba declarada como static con nothing y cuando se hacia un BeginRequest se validaba si ya se habia inicializado, en caso que no, se procedía a recorrer los asemblies y se llenaba el XMLDocument. Hasta ahi el stratup del app.
Ahora lo hice como dijiste, con carga on demand. Apenas termine los stress test aviso :) Saludos, Ing. Damián Herrera Director CIVINEXT Tel. / Fax: +54 (11) 3968-0039 [email protected] http://www.civinext.com <http://www.linkedin.com/company/civinext-s.a.> <http://www.facebook.com/groupware><http://www.twitter.com/damianherrera><http://www.youtube.com/user/damianherrera> <http://es.wikipedia.org/wiki/Civinext> El 19 de marzo de 2013 14:32, Angel "Java" Lopez <[email protected]>escribió: > Hola gente!**** > > ** ** > > Damian, pequenia gran pregunta:**** > > ** ** > > Tenes la declaración del XML Document? Digo, la línea donde esta declarada > la variable.**** > > ** ** > > No se si al principio esta en Nothing, y el startup lo CREAS Y LLENAS, o > si en la variable estatica lo creas con new, y en el startup LO LLENAS.*** > * > > ** ** > > Otra cosa: alguna pista en el Event Viewer? De reinicio de la aplicación?* > *** > > ** ** > > Si fuera por mi, no llenaría el XML Document en el startup, sino la > primera vez que alguien lo pide (haciendo que su variable al comienzo este > en Nothing, y controlando por Nothing cada vez que alguien lo pide). Y > loguearia en algún lado cuando paso por esa rutina de llenado, para ir > investigando cuando se llena de nuevo.**** > > ** ** > > Angel “SeDispararaElStartup?EstaraElAssemblyDisponibleAlLlegarAlStartup?” > Lopez**** > > ** ** > > *From:* [email protected] [mailto:[email protected]] *On Behalf Of *Damián > Herrera > *Sent:* martes, 19 de marzo de 2013 11:57 a.m. > *To:* [email protected] > *Cc:* [email protected] > > *Subject:* [puntonet] Manejo de memoria en ambientes sobrecargados**** > > ** ** > > Hola Angel,**** > > ** ** > > jajaja bien, si, es correcta la pregunta. Tengo "cosas" que guardo en un > cache propio para tener mejor eficiencia en las consulta a los mismos, pero > no es así en todos los temas que escribi. **** > > ** ** > > Por ejemplo, el XMLDocument es un object static que se llena únicamente en > el startup del webapp. Esto funciona bien, pero tengo este problema que > debes en cuando se vacía Necesito este XMLDocument porque en el mismo > almaceno XMLs que estan como recursos embebidos en un assembly, entonces > para no recorrer ese assembly cada vez, lo hago únicamente al inicio y > luego consulto contra este XMLDocument donde estan todos los XML > unificados. Respondiendo a las preguntas en este caso:**** > > 1) En el objeto estatico. **** > > 2) Este punto no tiene httphandler.**** > > 3) Es un objeto estatico.**** > > 4) Me da un error provocado por mi, que al buscar a través de un XPath en > el XMLDocument y no tener resultados, lanzo una excepcion directamente.*** > * > > ** ** > > El tema del Dictionary lo estoy debugeando todavía, porque no estoy seguro > de si es el Dictionary el que me da "Object reference not set to an > instance of an object" o un elemento dentro de él.**** > > ** ** > > Y por el tema de los javascript en cache, no te quiero aburrir, pero si, > esa es una larga historia que empezó cuando pasamos de la version .Net 1.1 > a la .Net 2.0 y el manejo de cache que hacia ASP.Net. Todo eso derivo en la > creación de una suerte de cache propio llamado Workspaces > que básicamente gestiona Cache y Session de una manera sencilla, pero con > depuración automática de objetos sin uso y demás cosas propias de un cache. > **** > > ** ** > > Para mi, tampoco es el GC el que esta molestando en este caso. Para mi, es > algo más vinculado al SO o algo similar. Porque en el caso del XMLDocument > no hay explicación. Y con el tema del Javascript tampoco.**** > > ** ** > > 6) Básicamente fue un cambio interior a partir de ver como evoluciona > la tecnología, lo que hacen los departamentos de marketing y demás yerbas. > La premisa que me dio la experiencia es que los objetos creados por uno > (clases y objetos) siempre perduran a través de los cambios y > evoluciones tecnológicas. En cambio un ASP.Net cache, un Dataset tipado > y poniéndonos melancólicos un Recordset no son objetos que duren en el > tiempo. Es más una filosofía a esta altura que un fundamento :) **** > > ** ** > > ** ** > > ** ** > > ** ** > > > **** > > Saludos,**** > > Ing. Damián Herrera > Director > CIVINEXT > Tel. / Fax: +54 (11) 3968-0039 > [email protected] > http://www.civinext.com**** > > <http://www.linkedin.com/company/civinext-s.a.> > <http://www.facebook.com/groupware><http://www.twitter.com/damianherrera><http://www.youtube.com/user/damianherrera> > <http://es.wikipedia.org/wiki/Civinext>**** > > ** ** > > ** ** > > El 19 de marzo de 2013 11:11, Carlos Salvatore < > [email protected]> escribió:**** > > Damián, > > > Me parece que si las referencias siguen vivas, no es un problema del > GC. El GC no debería liberar memoria y dejar las referencias "vivas". Eso > te podría pasar con un puntero pero no con una referencia en un entorno de > memoria manejado. > > Si no entiendo mal, lo que vos describís sería lo siguiente. Vos tenés > una serie de objetos estáticos. Esos objetos son consultados a través de > una suerte de caché. ¿Hasta ahí es correcto? > > Entonces > 1) Dónde las colecciones se truncan? En el caché o en objeto estático? > 2) WWWWH vacía el caché? > 3) Por qué el resguardo del caché es otro objeto en memoria? > 4) Qué sucede cuando el caché no tiene la colección? La busca en la > referencia estática? Verifica de algún modo que la referencia estática no > sea nula? En algún punto de este proceso se dispara la carga de estas > colecciones? (Podría pasar como resultado de la concurrencia que dos > threads distintos manden a cargar las colecciones y el segundo trunque la > carga del primero) > 4B) ¿Existe la posibilidad de que algún try/catch te esté escondiendo > una excepción de concurrencia? > 5) Si la caché en memoria apunta a otro objeto en memoria, cómo se > persisten estas colecciones (desde dónde se carga el contenido del objeto > estático, si es que se hace en algún momento)? > 6) Dado que ya sabemos que Aristóteles le criticó a Platón su solución > de duplicar los objetos hace más de dos mil años, cuál sería la causa que > justificaría que hagas lo mismo en tu aplicaición? (alerta de chicana, no > tomar a mal). > **** > > ------------------------------ > > Date: Tue, 19 Mar 2013 10:47:34 -0300 > Subject: [puntonet] Manejo de memoria en ambientes sobrecargados > From: [email protected] > To: [email protected]**** > > ** ** > > Hola Angel,**** > > ** ** > > Gracias por tu respuesta. Si, los objectos son compartidos por todos los > threads, son elementos static/shared de clases. En principio > no habíamos configurado el recicle del App Pool, hace ya unos meses lo > tenemos configurado para que todas las noches se recicle y eso hizo que se > caiga menos veces. La infraestructura es un Win 2008 R2, 64 bits, App Pool > en .Net 4 con el Managed Pipeline en Integrated mode.**** > > ** ** > > No es lo que dije originalmente, pero también tuve este tipo de problemas > con Recursos embebidos en el assembly. Básicamente son archivos de > javascript que cuando son pedidos a través de un HttpHandler se buscan en > un cache interno (que termina consultando un Synchronized Hashtable y de > vez en cuando, una vez por mes o cada tanto el javascript estaba roto, es > decir, me devolvía las primeras 200 lineas y el resto no estaba :) Esto lo > solucione poniéndole una marca al final del archivo para saber si lo que > tenia en memoria estaba completo o debía ir a buscarlo de nuevo al assembly > :s A partir de este caso pienso que hay veces que el proceso llega a un > punto donde se "estresa" y limpia su memoria dejando algunas posiciones > medio rotas.**** > > ** ** > > Se que suena a poco probable, el tema es que sucede cada tanto y no es > algo que pueda repetir en un ambiente controlado. En general hago stress > test de la webapp y funciona bien. No llego a tener estos problemas. **** > > ** ** > > ** ** > > ** ** > > > **** > > Saludos,**** > > Ing. Damián Herrera > Director > CIVINEXT**** > > Tel. / Fax: +54 (11) 3968-0039 > > *[email protected]* > *http://www.civinext.com***** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > El 19 de marzo de 2013 07:43, Angel "Java" Lopez <*[email protected]*> > escribió:**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Hola gente!**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Hmmm… Damian, no tengo todo el contexto, pero vieron si es algun problema > de concurrencia? Digo, estan ejecutando varios threads cuando tienen alto > trafico? Y esos threads estan accediendo a esos objectos en memoria? Son > compartidos entre los threads?**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Por lo que entendió, tenes objetos que VIVEN un tiempo en memoria > (horas?), y son consultados o manejados durante el alto trafico por los > clientes que llegan.**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > En donde esta corriendo esto? En un IIS, en un servicio, en Azure, en un > web farm? Reciclado de una instancia puede haber … (a la Yoda > ;-)****<#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Nos leemos!**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Angel “Java” Lopez**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > @ajlopez**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > *De:* *[email protected]* [mailto:*[email protected]*] *En nombre de > *Damián > Herrera > *Enviado el:* Monday, March 18, 2013 5:54 PM > *Para:* *[email protected]* > *Asunto:* [puntonet] Manejo de memoria en ambientes > sobrecargados****<#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Buenas,**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Espero que anden bien. Hace mucho que no escribo y buscando algo de info. > me pareció que era algo para postear en la > lista.****<#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Actualmente tenemos un problema en ambientes de alto > trafico, básicamente manejamos Generic.Dictionary(string,string) y > Xml.XmlDocument. Únicamente en ambientes de alto trafico, nos sucede de vez > en cuando que desaparecen elementos del Dictionary o el XmlDocument > queda vacío.**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Sospecho que el XMLDocument queda vacío porque hay momentos en los que no > se utiliza porque hay una capa de cache que hace que se lo consulte poco, > pero la referencia sigue activa dentro de una clase (esta declarado como > private shared). Algo similar ocurre con el Dictionary, pero este se usa > más que el XmlDocument.**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > La consulta en si misma es, hay alguna forma de "marcar" o especificar que > esas variables no deben ser recolectadas o alguna manera de que me entere > cuando las recolectan? Es algo que estuve buscando y no encontré mucha > info. y no estoy seguro que tenga que ver con el > GC.****<#13d83b6bbc46a4a9_13d82fd31c45d795_> > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Bueno, cualquier orientación se > agradece.****<#13d83b6bbc46a4a9_13d82fd31c45d795_> > > > **** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Saludos!**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > Ing. Damián Herrera > Director > CIVINEXT**** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > <#13d83b6bbc46a4a9_13d82fd31c45d795_> > Tel. / Fax: +54 (11) 3968-0039 > <#13d83b6bbc46a4a9_13d82fd31c45d795_> > *[email protected]* > *http://www.civinext.com***** > > **** > > **** > > <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > > ** ** <#13d83b6bbc46a4a9_13d82fd31c45d795_> > >
