2013-06-20 20 views
5

Pracujemy z Asp.Net WebApi na 3 serwerach za HAProxy. HAProxy po prostu losowo rozdziela żądania między te 3 instancje.Jak wykrywać problemy z wysoką wydajnością procesora i długim czasem reakcji z programem Asp.NET Web Api

Te instancje łączą się z mongodb, redis i niektórymi usługami Windows.

Zwykle w3wp.exe używa około 30% procesora na każdym serwerze APi.

Od czasu do czasu (kilka razy na godzinę) jeden z serwerów api decyduje się na użycie dużej liczby procesorów. W korelacji z tym zachowaniem zaczynamy dostrzegać coraz dłuższe czasy odpowiedzi. Liczby stale rosną, dopóki HAProxy nie wyświetli 10000ms czasów odpowiedzi i zdecyduje się skierować żądania do innych dwóch serwerów. Wszystko to za 10-20 sekund. Po pewnym czasie serwer wraca do normalnego stanu i ponownie pobiera żądania. Po kilku minutach inny serwer robi dokładnie to samo. To się ciągnie i trwa.

Używamy New Relic, ale ponieważ aplikacja jest aplikacją WebApi, nie otrzymujemy żadnych użytecznych informacji. Monitorujemy wszystkie nasze serwery (usługi redis, mongo i windows) w zakresie wykorzystania procesora, wykorzystania pamięci, ruchu sieciowego i operacji we/wy, ale nie widzimy żadnego znaczącego obciążenia podczas wspomnianych przestojów.

Jak możemy wykryć przyczynę tego zachowania aplikacji?

+0

Czy rozwiązałeś ten problem? Mam podobny problem z interfejsem sieciowym. W przypadku niektórych połączeń użytkownik nie otrzymuje odpowiedzi, a w3wp.exe uzyskuje wysokie zużycie pamięci. Czy możesz podzielić się swoją opinią na temat swojego problemu? –

Odpowiedz

0

Jedną rzeczą wspólną dla środowiska .NET i Java EE jest narzędzie do zbierania śmieci. Tak więc, jeśli twoja aplikacja używa dużej ilości pamięci, wtedy okresy wysokiego CPU mogą być wywoływane przez garbage collector. Miałem ten problem z .NET 3.5 IIS 7 z aplikacją, która konsekwentnie używała ponad gigabajta na proces. Garbage Collector zasadniczo zatrzymuje wszystko, gdy odzyskuje pamięć dla twojej aplikacji. Możesz zmienić ustawienia garbage collectora, a nawet wywołać je z kodu, gdy ma to sens. Istnieje wiele małych strategii, z których możesz skorzystać. Kolejny problem pojawi się w GC, jeśli robisz dużo i dużo ciągów. Na przykład analizowane są ciągi znaków przychodzące przez usługę Restful Web. Powoduje to dużą fragmentację pamięci i może spowodować, że GC spędza dużo więcej czasu i odzyskuje pamięć procesora.

Łatwo zauważyć, że tak się dzieje, jeśli tak właśnie się dzieje. Możesz użyć Taskmanager, aby obserwować wykorzystanie pamięci i procesor procesu. Spójrz na pamięć używaną, gdy procesor idzie w górę i po tym, jak znowu się obniża.

+0

Aplikacja używa bardzo mało pamięci, ponieważ nie przechowuje żadnej sesji, a jedyną rzeczą zajmującą miejsce w pamięci są instancje tworzone lokalnie. –

+0

W pamięci działa pamięć .Net jest to, że pamięć nie jest odzyskiwana przez chwilę, dopóki algorytm GC nie określi, że "teraz" byłby dobry czas. Częstotliwość GC zależy od ustawień, których używasz, oraz od szybkości, z której korzysta twoja aplikacja i zwalnia pamięć. Przechowywanie rzeczy w zmiennych sesji nie ma znaczenia. Na przykład parsowanie wielu ciągów ma znaczenie, ponieważ tworzymy małe fragmenty pamięci, które muszą zostać odzyskane i zrekombinowane; parsowanie łańcuchów zwiększy czas działania GCC, powodując wysokie wykorzystanie procesora i system, który nie reaguje. –