2009-09-23 20 views
12

Tengo un gran sitio web que parece estar absorbiendo toda la memoria que se está asignando. No hay nada más en el servidor al lado de este sitio. Dentro de una semana se come los 2 conciertos y requiere un reinicio. Actualmente, este es el servidor 2008 de 32 bits que utiliza IIS 7. Estamos volviendo a instalar para usar 64 bits y agregar más memoria. Sería bueno poder rastrear dónde están ocurriendo las fugas.¿Cómo detectar dónde se encuentra una pérdida de memoria?

¿Cuál es la mejor práctica para rastrear las pérdidas de memoria?

+0

Nos habían problema similar, sin embargo, cuando estamos utilizando una gran cantidad de herramientas de terceros y un montón de aplicaciones personalizadas, es difícil cambiarlo todo, mejor es , mantuvimos una tarea programada para hacer un reinicio suave cada noche cuando no hay ningún usuario conectado, en 5 minutos el servidor está activo pero seguro que ayuda en lugar de recodificar muchas cosas, ¡el problema es que los desarrolladores no hacen una codificación correcta y no usan buenas herramientas! ! –

Respuesta

1

Puede probar el uso de profilers como dotTrace - configúrelo en un seguimiento de memoria y ejecute su aplicación.

Esto debería darle pistas sobre qué ensamblajes y áreas de la aplicación consumen demasiada memoria en el arranque.

1

Esto es probablemente prevención en lugar de detección, pero en el nivel de código C#, debe comprobar que las clases que usan recursos grandes como imágenes y otros archivos están implementando correctamente the dispose pattern. Si es necesario, es posible que también deba sobrescribir el finalizador.

MSDN tiene una buena orientación sobre este tema.

Si tiene alguna clase en su aplicación que sepa que utiliza grandes recursos, estos son los primeros lugares para buscar problemas de memoria.

0

¿Realiza alguna interoperabilidad de Office? Si es así, asegúrese de limpiar los objetos de su aplicación. Ese es un posible culpable.

Otro es objetos globales, como cualquier cosa que sea estática.

3

En el monitor de rendimiento, agregue contadores para bytes de proceso/privados y .NET CLR Memory/# Bytes en All Heaps. Los bytes privados son todos memoria y la memoria CLR solo se gestiona. Entonces, si la memoria CLR permanece bastante pareja, pero los bytes privados continúan creciendo con el tiempo, esto significa que la fuga está en un recurso no administrado. Eso generalmente significa que no está eliminando los recursos nativos correctamente. Una buena cosa para mirar es cosas como COM o IO (secuencias y archivos). Asegúrate de que todas esas cosas se eliminen cuando hayas terminado.

0

¿Tiene muchas páginas dinámicas en su sitio?

También puede intentar IBM's Purify

Le sugiero que pruebe con un pequeño conjunto de páginas dinámicas incapacitantes todos los demás para el medio tiempo. Odio decir esto, pero es muy posible que IIS 7 también tenga filtraciones.

1

He encontrado que el EQATEC Profiler es bastante bueno, ¡además es gratis!

+1

EQUATEC es un perfilador de rendimiento (!) - no sirve para detectar fugas de memoria. –

1

Mira la memoria y laboratorios Pérdida de memoria en esta entrada del blog:

.NET Debugging Demos

Ellos pueden ser de alguna ayuda. Básicamente, puede usar WinDBG para analizar un volcado de memoria y ayudar a determinar qué está consumiendo toda su memoria.

Utilizamos un enfoque similar para determinar que Regex estaba masticando toda nuestra memoria, pero solo cuando el producto se ejecutaba en máquinas de 64 bits. La curva de aprendizaje es bastante empinada, pero WinDBG es una herramienta muy poderosa.

14

Las pérdidas de memoria en .NET no son tan comunes, pero cuando suceden, lo más habitual es que se deba a controladores de eventos no vinculados. Asegúrese de desconectar manejadores, antes de que los oyentes salgan del alcance.

Otra opción es si olvida llamar al Dispose() en recursos IDisposable. Esto puede evitar la limpieza de recursos no administrados (que no son manejados por GC).

Y otra posible razón es un finalizador estancado. Eso evitará que se recopilen todos los objetos restantes en la cola del finalizador.

Uso WinDbg + Sos para localizar fugas. Los pasos son los siguientes

  • volcar el montón y buscar sospechosos
  • Uso !gcroot para averiguar lo que mantiene a los sospechosos vivos
  • Repita según sea necesario

Tenga en cuenta que el uso de memoria de gran tamaño también puede deberse a la fragmentación del montón. Los montones regulares están compactados, pero los objetos fijados pueden causar fragmentación. Además, el LOH no está compactado, por lo que la fragmentación no es poco común para LOH.

excelentes tutoriales sobre WinDBG + SOS aquí: http://blogs.msdn.com/tess/

+0

+1 para otro seguidor de Tess! :) –

4

Ejecutar, no caminan, a Tess el blog de Ferrandez, If broken it is, fix it you should, que tiene así laboratorios de secuencias de comandos dedicados al aprendizaje para diagnosticar y depuración bloqueo, cuelgue y problemas de memoria con el código .NET. Ella tiene algunos de los mejores materiales que he encontrado hasta la fecha para ayudarlo a comenzar.

perfiladores de memoria comerciales como ANTS y SciTech son excelentes recursos que le muestran lo que los objetos están en el montón, y la forma en que se basan. La mayoría de los perfiladores de memoria comerciales tienen la capacidad de cargar una memoria 'instantánea' de un proceso (por ejemplo, desde su entorno de producción).

Puede capturar una memoria 'instantánea' (vea Snap v. Dump) usando adplus.vbs o DebugDiag. Adplus está disponible como parte del Debugging Tools for Windows. DebugDiag también tendrá un análisis rudimentario (pero parece ser más confiable en código no administrado) automágicamente.

supervisar la aplicación
Para tener una idea sobre lo que debe vigilar, ver Improving .NET Performance and Scalability, en concreto el capítulo 15.

En cuanto a la manera de supervisar, existen herramientas comerciales disponibles para que así, sin embargo, todos los de Windows la máquina también incluye Perfmon.exe, que se puede usar para registrar contadores de rendimiento relevantes.

Probar la aplicación
Para tener una idea sobre cómo realizar la carga, o el estrés, pruebas, echa un vistazo a los patrones y prácticas Performance Testing Guidance for Web Applications.

depurar la aplicación
Una vez que haya identificado que tienes un problema (monitoreo) y su poder reproducir el problema (prueba) se puede bajar a depurar el problema. Vea los enlaces para Tess: esa información lo llevará por un largo camino.

¡Luego enjuague y repita! :)

¡Buena suerte!
Z