php5-fpm: serwer osiągnął pm.max_children

41

Mam Nginx + php5-fpm . Kilka razy na godzinę moja strona zacina się, aw pliku dziennika widzę:

OSTRZEŻENIE: Serwer [pula www] osiągnął ustawienie pm.max_children (5), rozważ podniesienie go.

Plik /etc/php5/fpm/pool.d/www.conf zawiera następującą konfigurację:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Serwer: AMD Opteron ™ 3280, ośmiordzeniowy, 8x 2,4 GHz, 16 GB DIMM (DDR3).

Nie mam pojęcia, jakie liczby powinienem umieścić w pliku www.conf dla tego serwera. Czy mogę komuś pomóc? Dzięki

użytkownik1821484
źródło

Odpowiedzi:

40

Istnieje wiele możliwych powodów, dla których Twój PHP-FPM osiągnąłby max_children. Najczęstsze z nich to:

  • Wiele równoległych żądań od klientów
  • Powolne wykonywanie skryptów PHP
  • Bardzo niskie ustawienie max_children

Patrząc na specyfikacje twojej maszyny, zakładając, że nie ma nic innego niż PHP + Nginx, myślę, że możesz ustawić ją znacznie wyżej niż 5. Mówisz, że masz 8 rdzeni, zwykle Nginx potrzebuje znacznie mniej procesora niż PHP, więc z 5 dziećmi prawdopodobnie nigdy nie będziesz w stanie korzystać z nich wszystkich. Zazwyczaj ustawiam na coś takiego jak liczba rdzeni x 2 lub liczba rdzeni x 4 , w zależności od zużycia pamięci twoich skryptów PHP.

powtórna rozgrywka
źródło
To serwis randkowy z czatem php, a użytkownicy wysyłają miliony wiadomości błyskawicznych. Ostatniej nocy, kiedy miałem ~ 300 użytkowników online, polecenie netstat -an | grep 80 | wc - wynik był prawie 400.
user1821484
1
Mam faktycznie podobny serwis randkowy. Myślę, że zdecydowanie potrzebujesz więcej dzieci PHP. Moja konfiguracja jest następująca: 20 000 jednoczesnych użytkowników online, 12 maszyn PHP z 8 rdzeniami, 32 pracowników na każdej maszynie PHP. To działa całkiem dobrze. Powinieneś także sprawdzić, ile masz wolnej pamięci. Podejrzewam, że masz ją, chyba że Twój PHP jest ogromny. Jeśli masz wolną pamięć, dlaczego nie wykorzystać jej dla większej liczby pracowników?
powtórka
@ user1821484 To jest poprawne; pm.max_childrenjest o wiele za niski . Wartość 10 jest rozsądna w przypadku małego serwera VPS z 1 GB pamięci RAM; masz znacznie większy serwer. Podnoś tę wartość, aż przestaniesz otrzymywać błędy, a następnie podnieś ją ponownie na wypadek gwałtownego wzrostu ruchu.
Michael Hampton
Dziękuję za odpowiedzi. Zwiększyłem ustawienie pm.max_children do 10, a teraz zacząłem otrzymywać ten błąd: OSTRZEŻENIE: [pula www] wydaje się zajęta (być może trzeba zwiększyć pm.start_servers lub pm.min / max_spare_servers), spawnowanie 16 dzieci, jest 0 bezczynnie i 8 dzieci ogółem. Czy ktoś może mi zasugerować, co muszę zwiększyć? Dzięki.
user1821484,
rdzenie x 2 lub rdzenie x 4 brzmią dla mnie naprawdę nisko. Mam maszynę z 8 rdzeniami i 8 GB pamięci RAM z pm.max_children = 48 i nadal otrzymujemy ostrzeżenie o serwerze pm.max_children . To urządzenie nie jest bliskie limitu procesora lub pamięci. Myślę, że lepszym podejściem byłoby zoptymalizowanie tego ustawienia w połączeniu z odpowiednimi ustawieniami nginx (lub apache) i wybranie wartości po ustaleniu, ile pamięci zajmuje każdy proces PHP.
S. Imp
18

Odkryłem, że ustawienie wartości pm.max_requests (domyślnie komentowane) pomogło w naprawie tych błędów. To ustawienie wymusza odrodzenie żądań potomnych po wykonaniu określonej liczby żądań i może być pomocne, jeśli gdzieś w kodzie lub bibliotekach innych firm występują wycieki pamięci.

W /etc/php-fpm.d/www.conf :

pm.max_requests = 500
Tom Jowitt
źródło
13

Ten link może być przydatny - wyjaśnia, jak obliczyć liczbę procesów potomnych na podstawie ilości pamięci w systemie:

HTF
źródło
7
Ta odpowiedź będzie bezużyteczna, gdy ten link zniknie.
miken32
2
Zasadniczo link mówi ... Odpowiednią wartość dla pm.max_children można obliczyć jako: pm.max_children = Całkowita pamięć RAM przeznaczona dla serwera WWW / Maksymalny rozmiar procesu potomnego
jaywhy13