2011-09-17 10 views
6

Estoy creando un servicio de Windows basado en C# que se ejecutará 24x7 durante meses. Me gustaría poder rastrear el uso general de memoria de mi servicio. No necesita ser exacto hasta el byte. Una cantidad general asignada será suficiente. Estaré monitoreando esto para ver las tendencias en el consumo de memoria. ¿GC.GetTotalMemory() es una forma adecuada de controlar esto?C# - GC.GetTotalMemory() Pregunta

Conozco el Monitor de rendimiento y el uso de contadores. Sin embargo, este servicio se ejecutará en al menos 12 servidores diferentes. No quiero rastrear PM en 12 servidores diferentes. El servicio conservará toda la información de rendimiento y uso de la memoria, de todas las instancias, en un DB central para evitar esto y para un análisis más sencillo.

Respuesta

5

Solo si se trata de una aplicación de memoria totalmente gestionada. Si alguno de ellos llama al código no administrado, la memoria asignada allí nunca se registrará con el recolector de basura (a menos que alguien recuerde llamar al GC.AddMemoryPressure).

+0

Gracias. Es una aplicación puramente administrada. –

2

Utilice contadores de rendimiento. Puede configurarlos para que se registren en el archivo.

Como alternativa, puede leer los contadores de rendimiento en su código y guardar los datos en una ubicación central.

+0

+1 para contadores de rendimiento, ya que también le permiten controlar un millón de otras cosas, como la CPU y el uso de E/S, que podrían convertirse en un cuello de botella a lo largo del tiempo. –

+0

@TheCodeKing - Normalmente lo haría, y en realidad tengo. Sin embargo, este servicio se ejecutará en al menos 12 servidores diferentes. Realmente no quiero rastrear PM en 12 servidores diferentes. Persisto toda la información de rendimiento y uso de la memoria, de todas las instancias, a una base de datos central para evitar esto. –

+1

Puede conectarse a contadores de rendimiento en máquinas remotas, por lo que puede centralizar la administración y saber si aún no es apropiado. Por supuesto, también puede leer estos en el código. – TheCodeKing

3

GC.GetTotalMemory recupera la cantidad de memoria que se piensa asignar. Solo conoce la memoria asignada por los componentes administrados, a menos que llame al GC.AddMemoryPressure para informarle sobre otra memoria asignada.

Puede obtener una mejor idea de la cantidad real de memoria asignada leyendo Process.WorkingSet64, Process.VirtualMemory64, y otras propiedades similares de la clase Process. Simplemente llame al Process.GetCurrentProcess, y luego obtenga lo que necesita.

Dicho esto, probablemente sea mejor que uses los contadores de rendimiento.

3

Esto no es una respuesta directa a su pregunta, pero fue motivado por su intento de mantener su servicio en funcionamiento las 24 horas, 7 días a la semana.

Sería muy consciente de la fragmentación del montón. Ver this article para una explicación

+0

Gracias. Ese artículo parece útil. –

+0

Es aún más importante para aquellos que trabajan con unidad/nota lateral – Fawar