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.