Typowe nieprawidłowo działające wzorce dla aplikacji wielowątkowych
Wizualizator współbieżności pomaga deweloperom w wizualizacji zachowania aplikacji wielowątkowej.Narzędzie to obejmuje galerię typowe nieprawidłowo działające wzorce dla aplikacji wielowątkowych.Galeria zawiera typowe i rozpoznawalne wzorce, które są dostępne za pośrednictwem narzędzia wraz z wyjaśnieniem zachowania, które jest reprezentowane przez każdy wzorzec, prawdopodobny rezultat tego zachowania i najbardziej powszechne podejście do rozwiązania.
Rywalizacja blokad i wykonywanie szeregowe
Czasami jednordzeniowa aplikacja uporczywie kontynuuje wykonywanie szeregowe nawet posiada kilka wątków i komputer ma wystarczająca liczbę rdzeni logicznych.Pierwszym objawem jest mała wydajność wielowątkowa, nawet nieco wolniejsza niż dla wykonania szeregowego.W widoku wątków nie widać wielu wątków uruchomionych równolegle; Zamiast tego widać, że tylko jeden wątek wykonuje się w wybranym momencie.W tym momencie przy kliknięciu segmentu synchronizacji w wątku można zobaczyć stos wywołań wątku zablokowanego (blokowanie stosu wywołań) i wątek, który usunął warunek blokowania (odblokowanie stosu wywołań).Ponadto, jeśli nieblokujący stos wywołań występuje w analizowanym procesie wyświetlany jest łącznik wątku gotowego.Stąd można przejść do kodu blokujących i nieblokujących stosów wywołań, aby lepiej zbadać przyczynę szeregowania.
Jak pokazano na poniższej ilustracji, wizualizator współbieżności może również ujawnić ten objaw w widoku wykorzystania procesora gdzie, pomimo obecności wielu wątków, aplikacja używa tylko jeden rdzeń logiczny.
Aby uzyskać więcej informacji, zobacz "Performance Pattern 1: Identifying Lock Contention" na blogu Hazima Shafi Narzędzia wydajności współbieżnej dla systemu Windows w witrynie blogów MSDN sieci Web.
Nierówny rozkład obciążenia
Przy wystąpieniu nieprawidłowego rozkładu pracy w obrębie kilku równoległych wątków w aplikacji, zazwyczaj pojawia się wzór schodków w dół, gdy każdy wątek kończy swoją pracę, jak pokazano na poprzedniej ilustracji. Wizualizator współbieżności pokazuje najczęściej bardzo bliskie czasy rozpoczęcia dla każdego współbieżnego wątku.Jednak te wątki zwykle kończy się w sposób nieregularny zamiast kończenia jednoczesnego.Wzorzec ten wskazuje na nieregularny rozkład pracy w grupie równoległych wątków, który może prowadzić do zmniejszenia wydajności.Najlepszym podejściem do takiego problemu jest ponowne rozpatrzenie algorytmu, za pomocą którego praca została podzielony między równoległe wątki.
Jak pokazano na poniższej ilustracji, wizualizator współbieżności również może ujawnić ten objaw w widoku wykorzystania procesora jako stopniowy spadek w wykorzystaniu procesora.
Nadsubskrypcja
W przypadku nadsubskrypcji liczba aktywnych wątków w procesie jest większy niż liczba rdzeni logicznych dostępnych w systemie.Na poprzedniej ilustracji przedstawiono wyniki nadsubskrypcji ze znaczącym wywłaszczeniem w paśmie w wszystkich aktywnych wątków.Ponadto legenda wskazuje, że duży procent czasu mieści się w Wywłaszczaniu (84% w tym przykładzie).Może to wskazywać, że proces żąda od systemu wykonania większej liczby równoczesnych wątków niż liczba rdzeni logicznych.Jednak może to także oznaczać, że inne procesy w systemie korzystają z zasobów, co do których założono, że mają być dostępne dla tego procesu.
Podczas oceny tego problemu, należy rozważyć następujące czynniki:
Cały system może być w stanie nadsubskrypcji.Należy wziąć pod uwagę, że inne procesy w systemie mogą wywłaszczać wątki aplikacji.Po zatrzymaniu nad segmentem wywłaszczenia w widoku wątków etykietka narzędzia będzie identyfikować wątek i proces, który wywłaszczył wątek.Ten proces nie jest koniecznie tym, który był wykonywany przez cały czas podczas wywłaszczenia wątku aplikacji, ale stanowi wskazówkę co utworzyło nacisk na wywłaszczenie procesu.
Oceń, jak proces określa odpowiednią liczbę wykonywanych wątków podczas pracy na tym etapie.Jeśli proces bezpośrednio oblicza liczbę aktywnych równoległe wątków, należy rozważyć zmodyfikowanie tego algorytmu pod kątem liczby rdzeni logicznych dostępnych w systemie.Jeśli używasz platformy Concurrency Runtime, biblioteki Task Parallel Library lub PLINQ, wykonają one zadanie obliczenia liczby wątków.
Nieefektywne we/wy
Nadmierne lub nieprawidłowe użycie we/wy jest częstą przyczyną nieefektywności w aplikacji.Rozważając poprzednią ilustrację.Na profilu widocznej linii czas widać, że 42 procent widocznego czasu wątku jest pochłaniane przez We/Wy.Oś czasu pokazuje duże ilości We/Wy, co wskazuje, że profilowana aplikacji jest często blokowana przez We/Wy.Aby zobaczyć szczegółowe informacje na temat rodzajów We/Wy i kiedy program jest blokowany, powiększ obszary problematyczne, zbadaj profil widocznej osi czasu, a następnie kliknij określony blok We/Wy, aby wyświetlić bieżący stosy wywołań.
Kolejka blokad
Kolejki blokad występują, gdy aplikacja uzyskuje blokadę w kolejności pierwszy zgłoszony - pierwszy obsłużony i liczba przychodzących żądań o blokadę jest większa niż liczba przydzieleń.Połączenie tych dwóch warunków powoduje gromadzenie się żądań blokady.Jednym ze sposobów zwalczania tego problemu jest użycie "niesprawiedliwych" blokad lub zastosowanie blokad, które przydzielą dostęp pierwszemu wątkowi, który znajdzie je w stanie odblokowanym.Poprzednia ilustracja pokazuje zachowanie konwoju.Aby rozwiązać problem, spróbuj zmniejszyć rywalizację o synchronizację obiektów i spróbuj użyć niesprawiedliwych blokad.