Czemu procesy w FPM nie są zwalniane?

0

Temat trochę z d**y, bo nie do końca wiem o co zapytać. Sytuacja jest taka, że od pewnego czasu na mojej stronie co kilka dni procesy dobijają do max_children. Po tym na stronę nie da się wejść, a jak poczekamy trochę dłużej, to zobaczymy 502. Nie mam jakiegoś turbo dużego ruchu. Zacząłem to logować i większość requestów nie zjada więcej niż 2-4 MB ramu i trwa < 1 sec. Jest kilka po 5-10 sec.

Log z /etc/init.d/php7.0-fpm status podczas dzisiejszego incydentu:

● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-12-19 21:17:21 CET; 1 day 14h ago
  Process: 1781 ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf (code=exited, status=0/SUCCESS)
 Main PID: 1791 (php-fpm7.0)
   Status: "Processes active: 250, idle: 0, Requests: xxxxx, slow: 0, Traffic: 0.4req/sec"
    Tasks: 251
   Memory: 1.4G
      CPU: 1h 16min 18.230s
   CGroup: /system.slice/php7.0-fpm.service

Config:

pm = ondemand
pm.max_children = 250
pm.min_spare_servers = 6
pm.max_spare_servers = 12
pm.process_idle_timeout = 15s;
pm.max_requests = 500
1

Pytanie co robi ten proces?

  1. strace żeby zobaczyć czy coś robi
  2. pstack żeby zobaczyć stos wywołania (można próbkować np. co 1 sekundę przez 1 minutę i zobaczyć czy w próbkach przewija się ta sama ścieżka kodu)
1

Może być zwiecha na bazie danych. Kilka razy miałem tak że MySQL się zawieszał na jakimś konkretnym rekordzie.
Spróbuj znaleźć miejsce które powoduje wypełnianie puli. Przeczytaj to: https://stackoverflow.com/a/15473307/5305370 (patrz "slowlog").
Zwiększenie limitów może na chwilę pomóc, ale raczej nie rozwiąże problemu.

Kilka stron do poczytania:
https://myjeeva.com/php-fpm-configuration-101.html
https://www.if-not-true-then-false.com/2011/nginx-and-php-fpm-configuration-and-optimizing-tips-and-tricks/
https://www.kinamo.be/en/support/faq/determining-the-correct-number-of-child-processes-for-php-fpm-on-nginx

1

Trzeba też rzucić okiem na ogólną wydajność Twojego systemu, a nie tylko procesy php.

  1. Jak systemowo wszystko ok (nie ma innego procesu, który dużo wisi na running/io), to wtedy znajdź jakiś przykładowy skrypt PHP, który robi duże obciążenie (cpu-bound, bez IO) i odpal go na tej instancji (problematyczną stronę chwilowo wyłącz)
  • jeśli taki skrypt działa i nie "przytyka" się tak jak strona, to coś ze stroną jest (w tym np. z bazą danych - tu dłuższa sprawa)
  • jak przytyka się ten skrypt, to coś z konfiguracją php/systemu (lub zwyczajnie zbyt mało zasobów sprzętowych)
  1. Lepiej static zamiast ondemand, ponadto pm.max_children ustaw na liczbę mniejszą niż grep -c processor /proc/cpuinfo, aby Cie context switche nie zabiły
0

Możesz zdefiniować duże obciążenie cpu-bound? Jakiś czas temu zadawałem pytanie Co oznacza cpu w access logach php-fpm?
Mam skrypt, który zjada od 300 - 500 tych jednostek, czy to problem?

Osobiście śmierdzi mi to deadlockiem, albo czymś na bazie, ale zobaczymy.

0
Desu napisał(a):

Możesz zdefiniować duże obciążenie cpu-bound? Jakiś czas temu zadawałem pytanie Co oznacza cpu w access logach php-fpm?
Mam skrypt, który zjada od 300 - 500 tych jednostek, czy to problem?

Duże obciążenie cpu-bound, to obciążenie, które skupia się wyłącznie na użyciu procesora (czyli żadnego czekania na i/o, w tym nawet z RAMu optymalnie). Czyli chodzi o jakieś obciążające maksymalnie procesor zadanie (jakiś algorytm czy coś). Tylko unikałbym jakiejś "pustej" pętli for co liczy do miliona, bo tego typu konstrukcja może być optymalizowana przez interpreter.

Jego wywołanie jest tutaj po to, aby sprawdzić, czy sam demon php-fpm nie jest źródłem problemów wydajnościowych. Jeżeli takie zadanie nie będzie problemem, wówczas problem można ograniczyć do kwestii, że php-fpm czeka na coś (np. na bazę danych, na odczyt czegoś z dysku, itp) lub coś innego dzieje się w systemie co wpływa na wydajność PHP.

Jakiś czas temu zadawałem pytanie Co oznacza cpu w access logach php-fpm?
Mam skrypt, który zjada od 300 - 500 tych jednostek, czy to problem?

Znasz swoją konfigurację sprzętową i aktualny stan systemu? Bez tych danych nic nie da się powiedzieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1