DA0039: Bardzo wysokie stawki z blokady twierdzeniom
Identyfikator reguły |
DA0039 |
Kategoria |
Użycie .NET Framework |
Metody profilowania |
Próbkowanie Instrumentacja Pamięć .NET |
Wiadomość |
Występuje bardzo wysoka liczba rywalizacji blokad .NET.Zbadaj przyczynę rywalizacji blokad uruchamiając profilowanie współbieżności. |
Typ reguły |
Ostrzeżenie |
Podczas profilowania przy użyciu metody próbkowania, pamięci .NET lub metody rywalizacji o zasoby, musisz zebrać co najmniej 25 próbek, aby wyzwolić tę regułę.
Przyczyna
Dane o wydajności systemu zebrane za pomocą danych profilowania wskazują, że wystąpiła nadmiernie wysoka liczba rywalizacji blokad podczas wykonywania aplikacji.Rozważ ponowne profilowanie przy użyciu metody profilowania współbieżności, aby znaleźć przyczynę rywalizacji.
Opis reguły
Blokady są używane do ochrony krytycznych sekcji kodu, które w aplikacji wielowątkowej muszą być wykonywane szeregowo, przez jeden wątek jednocześnie.Środowisko uruchomieniowe CLR .NET firmy Microsoft dostarcza pełny zestaw podstawowych obiektów do synchronizacji i blokowania.Na przykład, język C# obsługuje instrukcję lock (SyncLock w języku Visual Basic).Aplikacja zarządzana może wywołać metody Monitor.Enter i Monitor.Exit z przestrzeni nazw System.Threading, aby bezpośrednio uzyskać lub zwolnić blokadę..NET Framework obsługuje dodatkowe obiekty podstawowe do synchronizacji i blokowania, w tym klasy, które obsługują wzajemne wykluczanie (muteksy), blokady ReaderWriterLock i semafory.Aby uzyskać więcej informacji, zobacz Omówienie podstawowych obiektów do synchronizacji w Przewodniku dewelopera .NET Framework w witrynie sieci Web MSDN.Klasy .NET Framework znajdują się w warstwie powyżej usług synchronizacji niższego poziomu wbudowanych w system operacyjny Windows.Zawierają one obiekty sekcji krytycznej i wiele innych funkcji sygnalizujących, takich jak Wait i event.Aby uzyskać więcej informacji, zobacz sekcję Synchronizacja w dziale Wytwarzanie aplikacji Win32 i COM w Bibliotece MSDN.
Zarówno podstawowe klasy .NET Framework, jak i natywne obiekty systemu Windows, które są używane do synchronizacji i blokowania, są lokalizacjami pamięci współużytkowanej, które muszą zostać zmienione przy użyciu operacji blokujących.Operacje blokujące używają instrukcji specyficznych dla sprzętu, które operują na lokacjach pamięci współużytkowanej, aby zmienić ich stan, przy użyciu operacji atomowych.Operacje atomowe gwarantują spójność między wszystkimi procesorami w komputerze.Obiekty .NET, takie jak Lock i WaitHandle, używają operacji blokowania automatycznie, gdy są ustawiane lub resetowane.Mogą istnieć inne struktury danych pamięci współużytkowanej w aplikacji, które także wymagają użycia operacji blokowania, aby zostać zaktualizowane w sposób bezpieczny wątkowo.Aby uzyskać więcej informacji, zobacz Operacje blokujące w sekcji .NET Framework, w Bibliotece MSDN.
Synchronizacja i blokowanie są mechanizmami używanymi do zapewnienia poprawnego wykonywania aplikacji wielowątkowych.Każdy wątek aplikacji wielowątkowej jest niezależną jednostką wykonywania, planowaną niezależnie przez system operacyjny.Rywalizacja blokad występuje, gdy wątek, który próbuje uzyskać blokadę jest opóźniony, ponieważ inny wątek wstrzymuje blokadę.
Blokady są często zagnieżdżone.Zagnieżdżanie występuje, gdy wątek wykonujący sekcję krytyczną, wykonuje funkcję, która wymaga innej blokady.Pewna liczba zagnieżdżonych blokad jest nieunikniona.Sekcja krytyczna może wywołać metodę .NET Framework, która opiera się na blokadach, aby zapewnić, że działa w sposób bezpieczny wątkowo.Wywołanie z niektórych sekcji krytycznych w aplikacji do metody frameworku, która także blokuje przy użyciu innego dojścia blokady, powoduje zagnieżdżanie blokad.Warunki zagnieżdżania blokad mogą prowadzić do problemów z wydajnością, które są bardzo trudne do rozwikłania i naprawienia.
Reguła ta jest uruchamiana, gdy pomiary wykonane podczas przebiegu profilowania wskazują, że istnieje bardzo wysoka liczba rywalizacji blokad.Rywalizacja blokad opóźnia wykonanie wątków, które oczekują na blokadę.Nawet stosunkowo niewielka liczba rywalizacji blokad w jednostce testowej lub testach obciążenia powinna zostać zbadana na sprzęcie komputerowym o niskiej wydajności.
[!UWAGA]
Jeśli liczba raportowanych rywalizacji blokad w danych profilowania jest znaczna, ale nie nadmierna, uruchomiony zostanie komunikat informacyjny DA0038: Twierdzeniom wysokie stawki Lock zamiast tego komunikatu z ostrzeżeniem.
Jak badać ostrzeżenie
Kliknij dwukrotnie komunikat, aby przejść do widoku Znaczniki danych profilowania.Znajdź kolumnę CLR .NET LocksAndThreads\Liczba rywalizacji / s.Określ, czy istnieją specyficzne fazy wykonywania programu, podczas których rywalizacja blokad jest większa niż w innych fazach.
Reguła ta jest uruchamiana, tylko gdy nie używasz metody profilowania współbieżności.Metoda profilowania współbieżności jest najlepszym narzędziem, którego można użyć do diagnozowania problemów z wydajnością związanych z rywalizacją blokad w aplikacji.Zbierz dane profilowania współbieżności, aby zrozumieć zachowanie blokowania w aplikacji.Obejmuje to zrozumienie, o które blokady toczy się największa rywalizacja, jak długo czas wykonywania wątku jest opóźniany przez oczekiwanie na rywalizację o blokady oraz jaki konkretny kod jest powiązany z tą sytuacją.Profilowanie współbieżności zbiera dane o wszystkich rywalizacjach o blokady, w tym o zachowaniu blokowania natywnych funkcji systemu Windows, klas .NET Framework i dowolnych bibliotek innych firm, do których odwołuje się aplikacja.Aby uzyskać informacje o profilowaniu współbieżności z poziomu zintegrowanego środowiska projektowego (IDE) Visual Studio, zobacz Zbieranie wątku i procesu współbieżności danych.Aby uzyskać łącza do informacji dotyczących profilowania współbieżności z poziomu wiersza polecenia, zobacz sekcję Using the Concurrency Method to Collect Resource Contention and Thread Activity Data w Przy użyciu profilowania metod zbierania danych wydajności z wiersza polecenia.