W logach wielu obciążonych firmowych stron pojawiają się dwa ostrzeżenia: "server reached MaxRequestWorkers setting" z Apache i "server reached pm.max_children setting" z PHP-FPM. Oba znaczą to samo: żądania czekają na wolny proces roboczy. Instynkt podpowiada, żeby podnieść liczbę i iść dalej, ale na serwerze z ograniczoną pamięcią zamienia to wolne strony na serwer, który używa swapu albo kończy mu się pamięć w najgorszym możliwym momencie. Dobra wydajność Apache bierze się z dobrania MaxRequestWorkers i PHP-FPM do pamięci RAM, którą naprawdę masz. Ten poradnik przeprowadza przez to obliczenie dla popularnej nowoczesnej konfiguracji: Apache 2.4 z event MPM przed PHP-FPM.
Najpierw potwierdź, jakiego MPM i obsługi PHP używasz
Liczby mają sens dopiero wtedy, gdy znasz architekturę. apachectl -V pokazuje aktywny MPM w wierszu "Server MPM", a w Debianie i Ubuntu a2query -M wypisuje tylko jego nazwę. W systemach opartych na Red Hat usługa nazywa się httpd, ale wydajność httpd podlega tym samym zasadom. Potem sprawdź, jak działa PHP: przez PHP-FPM, zwykle za pośrednictwem proxy_fcgi, czy jako mod_php wewnątrz Apache. Różnica jest duża:
- prefork z mod_php: każdy proces Apache niesie pełny interpreter PHP, nawet gdy tylko wysyła obraz. Pamięć na połączenie jest wysoka, a MaxRequestWorkers jest w praktyce Twoim limitem PHP.
- Apache event MPM z PHP-FPM: wątki Apache są lekkie i obsługują połączenia, pliki statyczne i keep-alive, podczas gdy PHP działa w osobnej puli procesów. Apache może utrzymać znacznie więcej połączeń, a pm.max_children w PHP-FPM staje się ustawieniem chroniącym pamięć.
Jeśli serwer nadal działa na prefork z mod_php, przejście na event z PHP-FPM jest zwykle najskuteczniejszą pojedynczą zmianą. Wymaga jednak testów, bo linie php_value w plikach .htaccess działają tylko z mod_php i trzeba je przenieść do puli PHP-FPM lub pliku .user.ini.
Zmierz zużycie pamięci Apache i rozmiar procesu PHP
Dobór zaczyna się od pomiaru w zwykłym okresie szczytu, a nie w spokojny niedzielny poranek. Sprawdź:
- Całkowitą pamięć RAM i to, co jeszcze działa na serwerze. Baza danych, cache taki jak Redis, usługi poczty i system operacyjny potrzebują swojej części, zanim procesy WWW dostaną cokolwiek.
- Średni rozmiar procesu PHP-FPM. ps z kolumną rss, przefiltrowane do procesów php-fpm, daje roboczą wartość. Użyj typowego rozmiaru pod obciążeniem, a nie najmniejszego bezczynnego procesu.
- Zużycie pamięci Apache na proces potomny. Przy event MPM jest ono zwykle skromne, bo wątki wewnątrz każdego potomka współdzielą pamięć.
Apache mod_status ze stroną server-status, ograniczoną do Twojego adresu IP, pokazuje tablicę wyników: ile procesów roboczych jest zajętych czytaniem, zapisywaniem lub utrzymywaniem połączeń keep-alive. Jeśli większość z nich tkwi w keep-alive, KeepAliveTimeout trzyma sloty dla bezczynnych przeglądarek.
Dobór PHP-FPM pm.max_children
W PHP-FPM robocza formuła jest prosta: pamięć, którą możesz dać PHP, podzielona przez średni rozmiar procesu PHP. Na przykład na serwerze z 8 GB RAM, gdzie baza danych, cache i system potrzebują około 4 GB, dla PHP zostaje mniej więcej 4 GB. Przy około 100 MB na proces daje to około 40 procesów potomnych i rozsądnie jest zacząć trochę poniżej tej wartości oraz obserwować.
Znaczenie mają jeszcze dwa ustawienia. Tryb menedżera procesów: dynamic utrzymuje zakres gotowych procesów, ondemand uruchamia je tylko w razie potrzeby, co pasuje do wielu małych stron na jednym serwerze, a static utrzymuje stałą liczbę, co pasuje do jednej obciążonej aplikacji. Oraz pm.max_requests, które recykluje każdy proces po ustalonej liczbie żądań, żeby powolne wycieki pamięci we wtyczkach się nie kumulowały. Zauważ, że domyślny plik puli dostarczany z PHP ustawia pm.max_children na zaledwie 5, więc obciążona strona działająca na ustawieniach domyślnych osiąga limit bardzo szybko.
Dobór MaxRequestWorkers dla event MPM
W event MPM MaxRequestWorkers to łączna liczba wątków, które mogą obsługiwać żądania jednocześnie, i musi mieścić się w ServerLimit pomnożonym przez ThreadsPerChild. Wbudowane wartości domyślne Apache to 16 procesów po 25 wątków, łącznie 400, a pliki konfiguracyjne dystrybucji często ustawiają niższe wartości. Ponieważ PHP-FPM już ogranicza pracę PHP, MaxRequestWorkers na serwerze event może spokojnie leżeć powyżej pm.max_children. Dodatkowe wątki kosztują mało pamięci i pozwalają Apache dalej serwować obrazy, arkusze stylów i połączenia keep-alive, gdy PHP jest zajęte. Jeśli podnosisz MaxRequestWorkers ponad ServerLimit razy ThreadsPerChild, podnieś też ServerLimit i zrestartuj Apache w pełni, bo łagodne przeładowanie nie zmienia ServerLimit.
W prefork MPM obliczenie jest ostrzejsze: MaxRequestWorkers pomnożone przez średni rozmiar procesu Apache musi mieścić się w pamięci pozostawionej dla Apache, bo każdy proces roboczy jest kompletnym procesem.
KeepAlive, limity czasu i testowanie wyniku
- KeepAliveTimeout. Domyślne 5 sekund jest rozsądne; długie wartości trzymają otwarte sloty dla przeglądarek, które już skończyły. Event MPM sprawnie obsługuje bezczynne połączenia keep-alive, co jest kolejnym powodem, by go preferować.
- Timeout. Bardzo długi limit czasu żądania pozwala kilku wolnym lub nadużywającym klientom zajmować procesy robocze. Dopasuj go do najwolniejszego prawidłowego żądania, na przykład dużego przesyłania pliku lub raportu.
- Jedna zmiana naraz. Wprowadzaj każdą zmianę łagodnym przeładowaniem, gdy to możliwe, obserwuj pamięć, tablicę wyników i czasy odpowiedzi w okresie szczytu i zachowaj poprzednią konfigurację, żeby móc wrócić.
To samo podejście, najpierw pomiar, dotyczy każdego projektu optymalizacji Apache i tak zaczyna się nasze dostrajanie wydajności Apache. Jeśli strony pozostają wolne, a procesy robocze stoją bezczynnie, wąskie gardło jest gdzie indziej, zwykle w zapytaniach do bazy lub samej aplikacji, i tu wchodzi strojenie MySQL i MariaDB.
Najczęściej zadawane pytania: MaxRequestWorkers
Czy po prostu podnieść MaxRequestWorkers, gdy pojawi się ostrzeżenie?
Dopiero po sprawdzeniu pamięci. Jeśli serwer ma zapas, umiarkowane zwiększenie jest w porządku. Jeśli jest już blisko użycia swapu, wyższy limit pogarsza sprawę; odpowiedzią jest mniej, ale szybszych żądań dzięki cache albo więcej pamięci.
Ile RAM potrzebuje strona WordPress na proces PHP?
To zależy od wtyczek i motywów, dlatego zmierzenie własnych procesów jest lepsze niż jakakolwiek reguła kciuka. Obciążone sklepy i kreatory stron potrzebują zwykle wyraźnie więcej na żądanie niż proste strony wizytówki.
Czy event MPM jest bezpieczny z plikami .htaccess?
Tak. MPM nie zmienia sposobu działania reguł przepisywania i dostępu w .htaccess. Zmienia się to, jak działa PHP, więc sprawdzenie dotyczy tego, czy ustawienia PHP w tych plikach trzeba przenieść do puli PHP-FPM.
Widzisz ostrzeżenia MaxRequestWorkers lub pm.max_children na serwerze w Los Angeles albo Long Beach? Nasza usługa optymalizacji serwera WWW Apache zaczyna się od pomiaru, a potem stroi razem MPM, PHP-FPM, cache i zabezpieczenia. Skontaktuj się z nami, podając ostrzeżenia z logu błędów i ilość RAM w serwerze.
Ile kosztuje serwer WWW Apache?
Samo oprogramowanie nic nie kosztuje: Apache HTTP Server to darmowe oprogramowanie open source, podobnie jak PHP-FPM, które jest dostarczane z PHP. W praktyce koszt serwera Apache, który ma znaczenie, to sprzęt i czas wokół niego. Procesy robocze dobrane ponad dostępną pamięć RAM wpychają serwer w swap, a typowy skrót to zakup większej maszyny. Zmierzenie rozmiaru procesu PHP, ustawienie pm.max_children i MaxRequestWorkers tak, by pasowały, oraz dodanie cache mogą pozwolić obecnemu serwerowi obsłużyć więcej ruchu, zanim potrzeba więcej pamięci.




