2012-01-10 4 views
5

Tengo un servicio Windows de .NET 4 escrito en C# ejecutando en Windows Server 2008, que cuando se supervisa con PerfMon, parece consumir 2.500 identificadores por hora. El contador "Handle Count" asciende siempre hacia arriba.Cómo solucionar la fuga de la manija en el servicio de Windows C#

Cuando miro los identificadores usando ProcExp con la opción "Mostrar combinaciones y manejos sin nombre" seleccionada, hay miles de identificadores de eventos y semáforos en la lista. La mayoría parece sin nombre. Busqué en el código fuente y no hay usos explícitos de AutoResetEvent o ManualResetEvent.

The Private Bytes counter escaladas y escaladas. No he visto el proceso durante más de un par de horas, pero dejaré que se controle durante la noche.

El servicio se ejecuta en un servidor remoto, por lo que no puedo adjuntar directamente un depurador, y probablemente tenga que volcar el proceso y analizarlo con WinDBG o similar.

¿Es posible ubicar uno de los identificadores y saber qué apunta y/o qué podría "ser suyo"? ¿Si es así, cómo?

En respuesta a los comentarios, a continuación se incluye un resumen de lo que hace el servicio.

  • anfitriones algunos servicios WCF
  • alberga una instancia de Quartz.NET planificador
  • anfitriones una cola de elementos de trabajo (empleos de cuarzo empujan los elementos de trabajo en una cola en lugar de hacer carreras de larga trabajar a sí mismos)
  • anfitriones un ejecutor de elemento de trabajo (elementos de trabajo son quitados de en un temporizador y se ejecutan lejos de cuarzo)
  • anfitriones un administrador de caché personalizado (que hace mucho trabajo ADO.NET)
+0

Parece una pregunta difícil. ¿Qué hace tu servicio? Uno supondría que utiliza alguna API que hace algunas cosas no administradas detrás de las escenas. Tal vez si mencionas qué bibliotecas usas, eso hará que la memoria de alguien funcione. De lo contrario, me temo que obtendrás respuestas como "asegúrate de llamar .Disponer()". –

+0

¿Su servidor utiliza código no administrado, colecciones concurrentes, sondeos largos? – adontz

+0

Gracias por sus comentarios hasta ahora. Ver descripción actualizada. – IanT8

Respuesta

1

El concepto fundamental detrás de la solución de problemas es el aislamiento. Aislamiento en términos de procesos y estado.

Lo primero que debe hacer es reproducir el problema en un entorno que controle. Intente configurar esto en su máquina de desarrollo, si hay servicios que llevarían demasiado tiempo configurarlos en un entorno de desarrollo, considere burlarse de ellos.

Una vez que tenga el control del entorno, puede comenzar a recortar el código que se está ejecutando simulando o borrando.

Cuestiones relacionadas