Udostępnij za pośrednictwem


Monitorowanie zasobów domeny aplikacji

Monitorowanie zasobów domeny aplikacji (ARM) umożliwia hostom monitorowanie użycia procesora i pamięci przez domenę aplikacji. Jest to przydatne w przypadku hostów, takich jak ASP.NET, które używają wielu domen aplikacji w długotrwałym procesie. Host może zwolnić domenę aplikacji, która negatywnie oddziałuje na wydajność całego procesu, ale tylko jeżeli jest w stanie zidentyfikować problematyczną aplikację. Usługa ARM udostępnia informacje, które mogą służyć do podejmowania takich decyzji.

Na przykład usługa hostingu może mieć wiele aplikacji działających na serwerze ASP.NET. Jeśli jedna aplikacja w procesie zacznie zużywać zbyt dużo pamięci lub zbyt dużo czasu procesora, usługa hostingu może użyć usługi ARM, aby zidentyfikować domenę aplikacji, która powoduje problem.

ARM jest wystarczająco lekki do użycia w zastosowaniach na żywo. Dostęp do informacji można uzyskać za pomocą śledzenia zdarzeń dla systemu Windows (ETW) lub bezpośrednio za pośrednictwem zarządzanych lub natywnych interfejsów API.

Włączanie monitorowania zasobów

Arm można włączyć na cztery sposoby: podając plik konfiguracji podczas uruchamiania środowiska uruchomieniowego języka wspólnego (CLR), korzystając z niezarządzanego interfejsu API hostingu, używając zarządzanego kodu lub nasłuchując zdarzeń ETW w ramach ARM.

Gdy tylko usługa ARM jest włączona, rozpoczyna zbieranie danych we wszystkich domenach aplikacji w procesie. Jeśli domena aplikacji została utworzona przed włączeniem usługi ARM, zbiorcze dane są uruchamiane po włączeniu usługi ARM, a nie podczas tworzenia domeny aplikacji. Po włączeniu usługi ARM nie można jej wyłączyć.

  • Możesz włączyć usługę ARM podczas uruchamiania środowiska CLR, dodając <element appDomainResourceMonitoring> do pliku konfiguracji i ustawiając atrybut na enabledtrue. Wartość (wartość false domyślna) oznacza tylko, że usługa ARM nie jest włączona podczas uruchamiania. Można ją aktywować później przy użyciu jednego z innych mechanizmów aktywacji.

  • Host może włączyć ARM, żądając interfejsu hostingu ICLRAppDomainResourceMonitor. Po pomyślnym uzyskaniu tego interfejsu usługa ARM jest włączona.

  • Kod zarządzany może włączyć usługę ARM, ustawiając właściwość statyczną (Shared w Visual Basic) AppDomain.MonitoringIsEnabled na true. Po ustawieniu właściwości usługa ARM jest włączona.

  • Można włączyć ARM po uruchomieniu, nasłuchując zdarzeń ETW. ARM jest włączone i rozpoczyna wywoływanie zdarzeń dla wszystkich domen aplikacji po włączeniu dostawcy publicznego Microsoft-Windows-DotNETRuntime przy użyciu słowa kluczowego AppDomainResourceManagementKeyword. Aby skorelować dane z domenami aplikacji i wątkami, należy również włączyć dostawcę Microsoft-Windows-DotNETRuntimeRundown za pomocą słowa kluczowego ThreadingKeyword .

Korzystanie z usługi ARM

Usługa ARM zapewnia łączny czas procesora używany przez domenę aplikacji i trzy rodzaje informacji o użyciu pamięci.

  • Łączny czas procesora dla domeny aplikacji w sekundach: jest obliczany przez dodanie czasów wątków zgłaszanych przez system operacyjny dla wszystkich wątków, które spędziły czas wykonywania w domenie aplikacji w okresie istnienia. Zablokowane lub śpiące wątki nie używają czasu procesora. Gdy wątek wywołuje kod natywny, czas, jaki wątek spędza w kodzie natywnym, jest uwzględniony w liczbie domen aplikacji, w której wykonano wywołanie.

  • Łączna liczba alokacji zarządzanych przez domenę aplikacji w okresie jej istnienia w bajtach: Łączna alokacja nie zawsze odzwierciedla użycie pamięci przez domenę aplikacji, ponieważ przydzielone obiekty mogą być krótkotrwałe. Jeśli jednak aplikacja przydziela i zwalnia ogromną liczbę obiektów, koszt alokacji może być znaczący.

  • Pamięć zarządzana w bajtach, do których odwołuje się domena aplikacji i która przetrwała najnowszą pełną, blokującą kolekcję: Ta liczba jest dokładna dopiero po pełnej, blokującej kolekcji. (Jest to w przeciwieństwie do kolekcji współbieżnych, które występują w tle i nie blokują aplikacji). Na przykład przeciążenie metody GC.Collect() powoduje pełną, blokującą kolekcję.

  • Łączna ilość pamięci zarządzanej w bajtach, do których odwołuje się proces, i która przetrwała najnowszą pełną, blokującą kolekcję: Pamięć przetrwana dla poszczególnych domen aplikacji może być porównywana z tą liczbą.

Określanie, kiedy występuje pełna kolekcja blokująca

Aby określić, kiedy liczba przetrwanych pamięci jest dokładna, musisz wiedzieć, kiedy właśnie wystąpiła pełna, blokująca kolekcja. Metoda wykonywania tej czynności zależy od interfejsu API używanego do badania statystyk usługi ARM.

Zarządzany interfejs API

Jeśli używasz właściwości klasy AppDomain, możesz użyć metody GC.RegisterForFullGCNotification, aby zarejestrować się, aby otrzymywać powiadomienia o pełnych kolekcjach. Używany próg nie jest ważny, ponieważ czekasz na ukończenie zbioru, a nie na jego zbliżanie się. Następnie można wywołać metodę GC.WaitForFullGCComplete, która blokuje do momentu ukończenia pełnej kolekcji. Można utworzyć wątek, który wywołuje metodę w pętli i przeprowadza wszelkie niezbędne analizy za każdym razem, gdy metoda zwraca wartość.

Alternatywnie można okresowo wywołać metodę GC.CollectionCount , aby sprawdzić, czy liczba kolekcji generacji 2 wzrosła. W zależności od częstotliwości sondowania ta technika może nie zapewniać tak dokładnego wskazania wystąpienia pełnej kolekcji.

Interfejs API hostingu

Jeśli używasz niezarządzanego API hostingu, host musi przekazać CLR implementację interfejsu IHostGCManager. CLR wywołuje metodę IHostGCManager::SuspensionEnding w momencie wznawiania wykonywania wątków, które zostały zatrzymane podczas procesu zbierania danych. ClR przekazuje generowanie ukończonej kolekcji jako parametr metody, więc host może określić, czy kolekcja była pełna, czy częściowa. Implementacja metody IHostGCManager::SuspensionEnding może wykonywać zapytania dotyczące przetrwałej pamięci, aby upewnić się, że liczby są pobierane natychmiast po ich zaktualizowaniu.

Zobacz także