2011-09-17 24 views
6

Tworzę usługę Windows opartą na C#, która będzie działać 24 godziny na dobę przez miesiące. Chciałbym móc śledzić ogólne wykorzystanie pamięci mojej usługi. Nie musi być dokładny do bajtu. Przydzielona ogólna kwota wystarczy. Będę monitorować to pod kątem trendów w zużyciu pamięci. Czy GC.GetTotalMemory() jest odpowiednim sposobem monitorowania tego?C# - GC.GetTotalMemory() Pytanie

Jestem świadomy Monitora wydajności i korzystania z liczników. Ta usługa będzie jednak działać na co najmniej 12 różnych serwerach. Nie chcę śledzić PM na 12 różnych serwerach. Usługa będzie utrzymywać wszystkie informacje o wydajności i wykorzystaniu pamięci, od wszystkich instancji, do centralnego DB, aby tego uniknąć i dla łatwiejszej analizy.

Odpowiedz

5

Tylko jeśli jest to aplikacja z czysto zarządzaną pamięcią. Jeśli którakolwiek z nich wywoła kod niezarządzany, przydzielona tam pamięć nigdy nie zostanie zarejestrowana przy użyciu garbage collectora (chyba że ktoś pamięta, aby zadzwonić pod numer GC.AddMemoryPressure).

+0

Dzięki. Jest to aplikacja czysto zarządzana. –

2

Użyj liczników wydajności. Możesz ustawić je, aby logować się do pliku.

Alternatywnie można odczytać liczniki wydajności w kodzie i zapisać dane w centralnej lokalizacji.

+0

+1 dla Perf Counters, ponieważ pozwalają one monitorować milion innych rzeczy, takich jak procesor i użycie We/Wy, które mogą stać się wąskim gardłem w miarę upływu czasu. –

+0

@ TheCodeKing - Zwykle chciałbym, i faktycznie mam. Jednak ta usługa będzie działać na co najmniej 12 różnych serwerach. Naprawdę nie chcę śledzić PM na 12 różnych serwerach. Utrzymuję wszystkie informacje dotyczące wydajności i użycia pamięci, od wszystkich instancji, do centralnego DB, aby tego uniknąć. –

+1

Można łączyć się z licznikami wydajności na komputerach zdalnych, więc w efekcie można scentralizować administrację, zrozumieć, czy nadal nie jest to właściwe. Oczywiście możesz je również przeczytać w kodzie. – TheCodeKing

3

GC.GetTotalMemory pobiera ilość pamięci, która ma zostać przydzielona. Zna tylko pamięć przydzieloną przez zarządzane komponenty, chyba że zadzwonisz pod numer GC.AddMemoryPressure, aby poinformować go o innej przydzielonej pamięci.

Możesz uzyskać lepszy obraz rzeczywistej ilości pamięci przydzielonej przez odczytanie Process.WorkingSet64, Process.VirtualMemory64 i innych podobnych właściwości klasy Process. Wystarczy zadzwonić pod numer Process.GetCurrentProcess, a następnie uzyskać to, czego potrzebujesz.

Powiedziawszy, prawdopodobnie lepiej wykorzystać liczniki wydajności.

3

To nie jest bezpośrednia odpowiedź na twoje pytanie, ale został poproszony przez twoją chęć utrzymania usługi 24 godziny na dobę przez 7 miesięcy.

Byłbym bardzo świadomy rozdrobnienia sterty. Aby uzyskać objaśnienie, patrz this article.

+0

Dziękuję. Ten artykuł wygląda na użyteczny. –

+0

Jest to nawet ważniejsze dla tych, którzy pracują z jednością/notatką boczną – Fawar