2013-02-25 5 views
6

Mamy stronę o dużym natężeniu ruchu, która generuje wiele wejść/wyjść. W ciągu 10 minut odczytuje ponad 10 GB danych (w3wp w pytaniu widziany w Menedżerze zadań). Do zawieszenia pamięci i aplikacji używam WinDbg z sukcesem. Ale nie wiem, jak mogę znaleźć obiekt (y)/metodę (metody) w procesie, który jest odpowiedzialny za najwyższe operacje we/wy.Jak znaleźć wąskie gardło w/w aplikacji asp.net

Czy to możliwe?

Edit Pytanie brzmi: Czy istnieje sposób do profilu operacji I/O w zespole .NET, powiedzmy: lista wątków posortowanych według najwyższej dysku I/O (lub coś podobnego, że pomoże mi gdzie look)

+0

Czy masz jakiś pomysł, gdzie może się dziać w kodzie, czy są uruchomione całkowicie ślepy? –

+0

Nie mam pojęcia, przeszedłem cały kod kilka razy (to całkiem spora strona, dużo funkcjonalności). Możliwe jest przesyłanie i wysyłanie zdjęć, ale to około 10 GB danych miesięcznie. –

+0

Czy przetwarzasz te obrazy w aplikacji przez przypadek? –

Odpowiedz

6

ANTS Performance Profiler

Użyłem tego narzędzia do wielkiego sukcesu - do czynienia ze znalezieniem szczegółowych instrukcji, które powodują ~ 512GB pamięci na internetowej farmie wysokonakładowego zaczyna żuć się w ciągu 5-10 minut . Brzmi jak bardzo podobna sytuacja jak twoja.

Teraz, aby być realistą, nie rozwiążemy magicznie problemu. Nadal wymaga wielu ustawień, dokładnej analizy i pracy detektywistycznej. Ale to narzędzie zdecydowanie podniosło problem z "praktycznie nierozwiązywalnego" do "możliwego do rozwiązania w ciągu kilku dni".

Aktualizacja:

Jak już wspomniano w komentarzach (i Ben Emmett echem), możemy użyć mrówki monitorować pamięć, system plików obsługuje - prawie żadnego zużycia zasobów i drążyć stos wywołań zobaczyć skutki określonych procedur.

+0

Czy mógłbyś nieco wyjaśnić, jak to zrobić z mrówkami? Czy używasz profilera pamięci? Uważam, że jest to trochę ograniczające w porównaniu do windbg. –

+0

@Elger zaczynając od najbardziej podejrzanych procedur, możemy obserwować, jak dużo pamięci, FS obsługuje, itp. Gromadzą się podczas tej rutyny - i zaczynają drążyć się w głębszych rutynach, podczas gdy akumulacja zasobów pozostaje stosunkowo płaska - co oznacza, że ​​zerujemy w na problem. –

+0

Jednak zużycie pamięci w rzeczywistości nie jest tak niepokojące (maks. 400 mb w zajętości, około 275 mb normalnie dla aplikacji 64-bitowej). Co masz na myśli przez 512 GB pamięci w swojej sytuacji? –

1

Wymyśliłem to narzędzie AppDynamics Lite, które wyświetla koszty połączeń i wydajność aplikacji w sposób wizualny. Może pomóc ci dowiedzieć się, które funkcje powodują najbardziej kosztowne operacje we/wy.

Cytowanie;

zrozumieć stan swoich CLR z kluczowych wskaźników, takich jak czas reakcji, wydajności, szybkości wyjątek i śmieci czasie zbiórki, jak również system klucza zasobu jak CPU, pamięci i dysku I/O.

Warto dać szansę, ponieważ jest próbny/bezpłatny przez 30 dni. Mam nadzieję, że to pomoże. Ps: Nie jestem związany z AppDynamics w żaden sposób.

1

Możesz użyć (bezpłatnie) Windows Performance Toolki t od systemu Windows 8, który działa również w systemie Windows Vista i nowszych. Możesz włączyć profilowanie systemowe, aby zobaczyć, co dzieje się we wszystkich procesach jednocześnie. Żadne oprzyrządowanie nie jest konieczne. Wymagane jest tylko jedno ponowne uruchomienie, aby ustawić tajemniczy klucz rejestru, który jest automatycznie wykonywany przez WPRUI.exe.

Z XPerf można włączyć chodzenie stosu IO Init tak, aby stos wywoławczy był brany za każde rozpoczęte IO. Jedynym problemem jest to, że stosy będą zepsute dla procesów 64-bitowych, co oznacza, że ​​zobaczysz tylko pierwszą metodę powyżej metod BCL twojego kodu, ponieważ istnieje błąd Windows 7 w funkcjach stackwalking systemu operacyjnego.

Rozwiązaniem jest Ngenowanie złożeń lub przenoszenie na serwer 2012 lub przejście na x86 w celu profilowania, aby wyświetlić głębsze stosy połączeń.

Zobaczysz całą aktywność IO i procesora pliku, nawet bez stosów wywołań i nazwy plików wraz z czasem użycia dysku twardego. To powinno dać ci dobrą informację, która część twojej aplikacji powoduje dysk IO. Z częściowych stosów połączeń powinieneś być w stanie wskazać swój problem, nawet bez pełnych stacków.

Narzędzie daje znacznie więcej wglądu niż jakikolwiek dostępny na rynku profiler, kosztem, którego potrzebujesz, aby nauczyć się go używać. Ponieważ stosy wywołań nie kończą się na kodzie lub w trybie użytkownika, ale w jądrze można również określić, czy np. skaner antywirusowy powoduje znaczące opóźnienia IO. Ale musisz wiedzieć, jak działa twój procesor. Ten zestaw narzędzi był pierwotnie przeznaczony dla twórców jądra, co wyjaśnia, dlaczego widzisz tyle bezużytecznych kolumn.

Na poniższym obrazie widać zużycie IO i procesora. Po wybraniu wysokiego pliku IO na wykresie IO dysku, podświetlone zostanie zużycie procesora wszystkich powiązanych stosów połączeń, które zostały pobrane w tym samym czasie, gdy IO było aktywne. W ten sposób możesz bezpardonowo nawigować z IO do potencjalnie zablokowanych wątków.

enter image description here

+0

Wow, wielkie dzięki za wgląd. Nie wiedziałem, że to istnieje. Spróbuję tego. –