8-rdzeniowy VPS 24 GB kończy Ci się pamięć? Praktyczny przewodnik po ekstremalnym dostrajaniu puli procesów PHP-FPM z HestiaCP

Liczba jednoczesnych użytkowników, z jaką może obsłużyć serwer, zależy nie od liczby jego rdzeni, ale od ilości pamięci zużywanej przez każdy proces.

To stwierdzenie może brzmieć jak prowokacja, ale jest to najbardziej realne i bolesne doświadczenie w branży operacyjnej i konserwacyjnej.

Dlaczego pamięć jest głównym wąskim gardłem?

Wiele osób widząc VPS z 8-rdzeniowym procesorem i 24 GB pamięci podświadomie myśli, że bez problemu można na nim uruchomić setki procesów PHP-FPM.

W rzeczywistości jednak użycie pamięci RSS przez pojedynczy proces PHP wynosi często aż 200 MB.

Oto wynik uzyskany w wyniku rzeczywistych testów za pomocą wiersza poleceń:

ps --no-headers -o rss -p $(pgrep php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

W złożonym środowisku HestiaCP i wielu wtyczkach, szczególnie bez optymalizacji OPcache, 200 MB jest normą.

Oznacza to, że pamięć, a nie procesor, jest sztywnym limitem określającym maksymalną współbieżność.

8-rdzeniowy VPS 24 GB kończy Ci się pamięć? Praktyczny przewodnik po ekstremalnym dostrajaniu puli procesów PHP-FPM z HestiaCP

Zalecany plik konfiguracyjny (php-fpm.conf)

pm = dynamic
pm.max_children = 80
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s

Logika obliczania parametrów i podstawa ustawień

Parametry konfiguracyjneUstawienie wartościPodstawa obliczeń i konfiguracji rdzenia
pmdynamicTryb dynamiczny umożliwia elastyczne dodawanie lub usuwanie procesów na podstawie wymagań współbieżności, równoważąc szybkość reakcji i wykorzystanie pamięci.
pm.max_children8024 GB pamięci całkowitej, pomniejszone o jądro systemowe i MySQL/RedisPo Nginxie na PHP pozostaje około 16 GB.16,384 MB / 200 MB ≈ 81.9Ustawienie wartości na 80 może całkowicie wyeliminować problem braku pamięci (OOM) występujący przy dużej współbieżności.
pm.start_servers16Liczba rdzeni procesora podczas rozruchu jest podwajana (8 rdzeni × 2 = 16), co pozwala mieć pewność, że usługa po ponownym uruchomieniu będzie w stanie natychmiast obsłużyć podstawową współbieżność.
pm.min_zapasowe_serwery8Ustaw liczbę rdzeni procesora na 8, aby mieć pewność, że na nowe żądania będzie można odpowiadać w dowolnym momencie w okresach niskiego ruchu.
pm.max_spare_servers24Ustaw ją na trzykrotność liczby rdzeni procesora (8 rdzeni × 3 = 24), aby zachować umiarkowaną liczbę procesów po ustaniu ruchu, co pozwoli poradzić sobie z niewielkimi wahaniami.
pm.max_requests500Jeśli pojedynczy proces osiągnie rozmiar bazy 200 MB, zmniejszenie liczby żądań do 500 spowoduje zniszczenie i odbudowanie procesu, co może szybciej usunąć niejawne wycieki pamięci.
pm.process_idle_timeout10s超出 min_spare_servers Bezczynne procesy są automatycznie zwalniane i powracają do pamięci systemowej po 10 sekundach braku żądań.

Niezbędne ustawienia pomocnicze i sugestie dotyczące optymalizacji

1. Mechanizm zapobiegający kacowi po wyłączeniu

request_terminate_timeout = 60s To jest klucz.

Może wymusić zakończenie procesów, które utknęły z powodu zablokowania bazy danych lub blokowania interfejsu API innej firmy.

Tymczasem Nginx fastcgi_read_timeout Musi on trwać co najmniej 60 sekund, w przeciwnym razie klient otrzyma go przedwcześnie. 504 Gateway Timeout.

2. Strategie pokonywania wąskich gardeł pamięci

Maksymalnie 80 równoczesnych procesów oznacza, że ​​w ekstremalnych warunkach współbieżności system może obsłużyć jednocześnie maksymalnie 80 dynamicznych żądań HTTP.

Jeśli chcesz jeszcze bardziej zwiększyć wydajność, powinieneś skupić się na zmniejszeniu wykorzystania pamięci dla każdego procesu.

  • Włącz OPcache:Wzór php.ini Średnia konfiguracja opcache.enable=1 i opcache.memory_consumption=256Buforowanie bajtkodu może zmniejszyć zużycie pamięci przez pojedynczy proces z 200 MB do 60~100 MB.
  • Rozsądna kontrola limitu pamięci:将 php.ini środkowy memory_limit Ograniczone do 128M256MAby zapobiec powstawaniu pojedynczych nieprawidłowych skryptów无限Zajmuje dużo pamięci.

Gdy wykorzystanie pamięci przez pojedynczy proces spadnie do 100 MB...pm.max_children Można go bezpiecznie ulepszyć do 150 Ponadto możliwości współbieżności niemal się podwoiły.

Przytoczone autorytatywne punkty widzenia

Zgodnie z zaleceniami oficjalnej dokumentacji Nginx :

„Aplikacje FastCGI należy zawsze monitorować za pomocą dyrektyw timeout, aby zapobiec wyczerpaniu zasobów”.
(Źródło: Dokumentacja Nginx)

Oficjalny podręcznik PHP wyraźnie stwierdza:

„pm.max_children definiuje maksymalną liczbę procesów potomnych, które mają zostać utworzone. To najważniejsza dyrektywa”.
(Źródło: Dokumentacja PHP-FPM)

Te autorytatywne poglądy doskonale wpisują się w naszą praktykę, dowodząc, że logika optymalizacji nie opiera się wyłącznie na doświadczeniu, ale również na standardowych najlepszych praktykach.

Wnioski: Moje poglądy i kluczowe cytaty

W scenariuszach o wysokiej współbieżności procesor jest silnikiem, pamięć jest zbiornikiem paliwa, a PHP-FPM jest dyspozytorem floty.

Niezależnie od mocy silnika, jeśli zbiornik paliwa jest za mały, konwój nie pojedzie daleko.

Prawdziwi eksperci nie maksymalizują bezmyślnie parametrów, lecz raczej precyzyjnie obliczają użycie pamięci przez każdy proces, aby uniknąć zarówno marnotrawstwa, jak i przepełnienia.

Istotą optymalizacji jest znalezienie optymalnej równowagi przy ograniczonych zasobach.

To nie tylko technologia, ale i filozofia.

Dlatego przestań wierzyć, że „liczba rdzeni decyduje o wszystkim”. To, co naprawdę decyduje o granicy współbieżności, to Twoja kontrola nad pamięcią.

Podejmij działania i zoptymalizuj swój VPS, wykorzystując w pełni jego potencjał, maksymalnie wykorzystując każdą kroplę pamięci.

发表 评论

您的邮箱地址不会被公开。必填项已用*标注

Przewiń do góry