Które zainstalować: Apache Worker lub Prefork? Jakie są (nie) zalety każdego z nich?


55

W oparciu o opisy zarówno narzędzia Prefork, jak i Worker MPM, wydaje się, że typ prefork jest nieco przestarzały, ale tak naprawdę nie mogę znaleźć odpowiedniego porównania tych dwóch typów.

Co chciałbym wiedzieć:

  • Jakie są różnice między dwiema wersjami?
  • Jakie są (nie) zalety każdego typu serwera?
  • Czy istnieją jakieś podstawowe wytyczne dotyczące tego, który typ wybrać na podstawie warunków?
  • Czy istnieją między nimi duże różnice w wydajności?

Odpowiedzi:


40

Jak mówią doktorzy, powinieneś użyć prefork MPM, jeśli chcesz uniknąć wątków w celu zapewnienia zgodności z bibliotekami nie-bezpiecznymi dla wątków. Zazwyczaj każdy nietrywialny moduł Apache ( mod_php- a ściślej miriada rozszerzeń i bibliotek, do których się łączy - będący przykładem kanonicznym) ma jakąś bibliotekę nie bezpieczną dla wątków (lub ma nie-wątkową bibliotekę bezpieczny kod), więc jeśli nie używasz dość standardowej instalacji Apache, wybrałbym prefork MPM.


3
Poleciłbym MPM pracownika, chyba że używasz PHP. Worker jest zalecanym MPM z apache i zapewnia lepszą wydajność i niższe koszty ogólne. Tyle tylko, że deweloper PHP nigdy nie słyszał o bezpieczeństwie wątków, którego należy użyć przed przygotowaniem.
David Pashley

16
PHP jest bardzo bezpieczny dla wątków od bardzo dawna. Sugerują jedynie użycie widełek wstępnych, ponieważ nie mogą kontrolować, co robią inne biblioteki. Przestań obwiniać PHP za brak działania innych programistów.
Alister Bulman

3
PHP może być wątkowo bezpieczny (chociaż wątpię w to), ale wszystkie biblioteki, do których się łączy, na pewno nie są. Tutaj uruchamiamy kilka dość dużych aplikacji PHP i co kilka miesięcy próbujemy przełączyć się z prefork na pracownika, ale natychmiast otrzymujemy uszkodzone dane.
Aleksandar Ivanisevic

5
Przynajmniej zmienna funkcji ENV zmienna nie będzie bezpieczna dla wątków, setlocal php.net/manual/en/function.setlocale.php jest tego częstym przykładem.
promień

4
Jedna uwaga: te problemy nie mają zastosowania, jeśli PHP jest dołączone np. Za php-fpmpośrednictwem FastCGI. Wtedy MPM procesu roboczego jest w porządku - wtedy fpm uruchomi każde żądanie PHP we własnym procesie, podczas gdy Apache może uruchomić wątki. Problem bezpieczeństwa wątków PHP uniemożliwia korzystanie z niego mod_php, który uruchamia PHP w procesie Apache.
mschuett,

13

Klasycznym rozwiązaniem do uruchamiania niebezpiecznych rozszerzeń podczas obsługi dużej liczby (> 100) równoczesnych połączeń jest uruchomienie PHP na fastCGI (mod_fcgid, natywny moduł apache) i dynamiczne żądania proxy do tego z instancji apache, która uruchamia Worker MPM.

Umożliwiłoby to skalowanie od kilkuset do> 1000 równoczesnych połączeń z niewielką ilością pamięci (4 ~ 8 GB) przy podawaniu mieszanki zawartości statycznej i dynamicznej.

Oczywiście powinieneś również zbadać front-endowe rozwiązania buforowania jako część ogólnego wdrożenia (memcached, lakier).

Alternatywnie, uaktualnij do apache 2.4 i jego macierzystego zdarzenia MPM, które obsługuje współbieżność w znacznie ulepszony sposób (wątki są odpalane po połączeniu, nie czekając na odpytanie).


czy mógłbyś rozwinąć komentarz do wydarzenia mpm? Jak to się układa w porównaniu do MPM-Worker?
Sirex,

Podczas gdy MPM procesu roboczego był już oparty na wątkach, a zatem znacznie szybszy do uruchomienia i lżejszy do uruchomienia, zdarzenie MPM nie odpytuje już gniazda - otrzymuje powiadomienie o aktywności; dlatego „wydarzenie”.
adapttr

więc powinien działać lepiej w witrynach o dużym ruchu (13k / s)?
Sirex,

6

Minęło około 3 lat od opublikowania pytania, ale zalecam skorzystanie z MPM pracownika zamiast wstępnego rozwidlenia, nawet jeśli używasz PHP, aby uzyskać lepszą wydajność.

Jeśli chodzi o różnice, pre-fork nie jest wątkowy, dlatego serwer forksuje proces dla każdego żądania klienta (wstępnie forks w oczekiwaniu na nowe żądania, aby rozwidlenie nie pochłaniało czasu odpowiedzi). Ponieważ żądania są przetwarzane przez serwer w osobnym procesie, zwykle powoduje to o wiele większe obciążenie Twojej pamięci i procesora. Pracownik wprowadza wielowątkowość, która jest lżejsza i ma lepsze wykorzystanie pamięci.


2

To jest coś szczególnego do tego, co serwujesz. Jeśli wykonujesz wiele małych połączeń statycznych, wątki byłyby lżejsze i szybsze. Jeśli tylko kilka dużych aplikacji ciągle się odradza, prefork może mieć przewagę ze względu na dojrzałość i stabilność. Dlaczego nie wystarczy ustawić to, czego potrzebujesz, przetestować jeden, wymienić moduł MPM, spróbować ponownie, zobaczyć, który z nich bardziej Ci odpowiada?


Nie możesz arbitralnie „zamienić” MPM w apache 2.2; jest ustawiony w czasie kompilacji.
adapttr

Możesz z apt lub RPM. Debian ma kilka różnych pakietów Apache 2, w zależności od preferowanego stylu.
Brendan Byrd

1

które wymagają rodzaju i rodzaju ruchu, jaki będziesz mieć. A także najpierw musisz zrozumieć główną różnicę między preforką a pracownikiem. Mam nadzieję, że poniższy artykuł pomoże Ci dowiedzieć się! http://slashroot.in/how-is-nginx-different-from-apache


2
Wolimy, aby odpowiedzi zawierały treść, a nie linki do treści. Jeśli możesz podać podsumowanie tego, co znajduje się w elemencie docelowym linku, jest to najlepsza praktyka. Zgnilizna linków ma miejsce.
sysadmin1138

1
Pytanie o Apache'u (nginx nie Apache) i zaletach prefork lub nitek (nginx używa ani)
symcbean
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.