2010-01-27 14 views
52

Jaka jest najlepsza praktyka przy podejmowaniu decyzji, ile procesów roboczych dopuszcza aplikacja internetowa ASP.NET?ASP.NET Web Garden - Ile procesów roboczych jest mi potrzebne?

Na jednym serwerze zarządzam, tworzenie nowego AppPool domyślnie wynosi 10 (maksymalnie) procesów roboczych. Inne osoby sugerują, że normalne ustawienie to jedno.

Jaki problem rozwiązuje wiele procesów roboczych i jakie są techniki decydowania o tym, ile?

+1

Nie byłem pewien, czy byłoby to bardziej odpowiednie tutaj, czy na serwerze ServerFault, daj mi znać, jeśli zrobiłem zły wybór, a ja to przeniesię. –

+4

Śmiało i zapytaj w obu miejscach. Myślę, że twoje pytanie jest tutaj istotne. Specyfika wdrożenia ASP.Net często wchodzi w zakres specjalizacji programisty, zwłaszcza w zakresie optymalizacji aplikacji. – DOK

+6

Zgadzam się z DOK. Oba miejsca są odpowiednie. Dev są często tymi, którzy muszą powiedzieć użytkownikom sieci, jak skonfigurować serwer. Z tego powodu muszą mieć te informacje. – NotMe

Odpowiedz

47

Procesy pracownicze są sposobem na segmentację realizacji witryny w wielu systemach exe. Robisz to z kilku powodów, jeden z nich, gdy jeden z pracowników zostaje zepsuł się przez problemy z uruchomieniem, nie zabiera innych. Na przykład, jeśli pojawi się żądanie html, które powoduje, że proces jest uruchamiany w nic, wtedy tylko inne żądania, które są obsługiwane przez ten jeden procesor roboczy, zostają zabite. Innym przykładem jest to, że jedno żądanie może spowodować blokowanie innych wątków obsługiwanych przez tego samego pracownika.

Jeśli chodzi o liczbę potrzebną, wykonaj test obciążenia. Hit aplikacji mocno i zobacz, co dzieje się tylko z jednym. Następnie dodaj trochę więcej i uderz jeszcze raz. W pewnym momencie osiągniesz punkt naprawdę nasycający sieć komputerów, dysk, procesor i pamięć RAM. Wtedy wiesz, że masz właściwą równowagę.

Nawiasem mówiąc, można kontrolować liczbę wątków używanych na proces roboczy za pomocą pliku machine.config. Uważam, że kluczem jest maxWorkerThreads.

Teraz, uwaga, jeśli używasz sesji, stan sesji nie jest dzielony między procesy robocze. Ogólnie zalecam unikanie sesji, ale warto o tym pamiętać.

Dla wszystkich celów i celów każdy proces roboczy może być traktowany jako oddzielny serwer WWW. Tylko że działają na tym samym polu.

+1

W rzeczywistości był to problem ze stanem sesji, który wywołał to pytanie (patrz http://stackoverflow.com/questions/2147578/asp-net-session-state-and -wielokrotne procesy robocze). Dziękujemy za pomocną odpowiedź (+1) –

+2

Ustawienie domyślne to zwykle jedno. Twój serwer, który ma domyślnie 10, musiał zostać zmodyfikowany, aby zmienić ustawienia domyślne. – NotMe

+1

@ChrisLive, Stan sesji jest współdzielony między procesami roboczymi, infact State State jest również współdzielony między wieloma witrynami o tej samej nazwie pliku cookie. –

4

pamięci Wycieki

Drugą największą zaletą jest obsługa wycieków pamięci. Czasami próbujesz zoptymalizować swój kod, ale w samej strukturze i bibliotekach innych firm występują wycieki pamięci. Zauważyliśmy, że w końcu nasza aplikacja osiąga bardzo wysoką pamięć i zaczyna brakować wyjątków pamięci.

Musieliśmy ustawić maksymalne ograniczenie pamięci wirtualnej w procesie roboczym tak, aby przypominało 1 GB i umożliwić uruchamianie wielu procesów. Można ustawić maksymalny limit wirtualny nawet dla pojedynczego procesu roboczego, ale prowadzi to do skoków spowolnienia, ponieważ gdy proces roboczy jest poddawany recyklingowi, wszystkie żądania są wolne, dopóki proces roboczy czasu nie uzyska dużej prędkości. Ponieważ nasza aplikacja ma buforowanie wewnętrzne (pamięć podręczna zapytań Entity Framework, niektóre pule obiektów), każda z tych rzeczy spowalnia uruchamianie aplikacji. To tam boli proces jednego pracownika.

Jeśli istnieje wiele procesów roboczych, tylko jeden z procesów w trybie recyklingu jest wolny, ale inne zachowują dobrą prędkość.

1

Kolejny przypadek, gdy ma sens wiele procesów roboczych, jeśli aplikacja zawiera blokady, które uniemożliwiają jej równoległość. Przetwarzanie obrazu oparte na GDI + jest jednym z przykładów.

Znalazłem go, gdy próbowałem znaleźć rozwiązanie dla my problem.

Powiązane problemy