Ciągle napotykałem takie błędy,
[02-Jun-2012 01:52:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 49 total children
[02-Jun-2012 01:52:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 19 idle, and 50 total children
[02-Jun-2012 01:52:06] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 19 idle, and 51 total children
[02-Jun-2012 03:10:51] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 18 idle, and 91 total children
Zmieniłem ustawienia php-fpm na te,
pm.max_children = 150 (It was at 100, i got a max_children reached and upped to 150)
pm.start_servers = 75
pm.min_spare_servers = 20
pm.max_spare_servers = 150
Wynikające z
[02-Jun-2012 01:39:19] WARNING: [pool www] server reached pm.max_children setting (150), consider raising it
Właśnie uruchomiłem nową stronę internetową, która generuje znaczny ruch. Ten ruch jest uzasadniony, a użytkownicy osiągają 504 przekroczenia limitu czasu bramy po osiągnięciu limitu.
Mam ograniczone połączenia z moim serwerem za pomocą IPTABLES i uruchamiam fail2ban i śledzę dzienniki dostępu nginx. Cały ruch jest legalny, po prostu kończy mi się miejsce dla użytkowników.
Obecnie korzystam z dwurdzeniowego urządzenia z 64-bitowym Ubuntu.
free
total used free shared buffers cached
Mem: 6114284 5726984 387300 0 141612 4985384
-/+ buffers/cache: 599988 5514296
Swap: 524284 5804 518480
Mój php.ini max_input_time = 60
Moja konfiguracja Nginx to
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 19000;
# multi_accept on;
}
worker_rlimit_nofile 20000; #each connection needs a filehandle (or 2 if you are proxying)
client_max_body_size 30M;
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
location ~ \.php$ {
try_files $uri /er/error.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_max_temp_file_size 0;
fastcgi_intercept_errors on;
fastcgi_pass unix:/tmp/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Co mogę zrobić, aby przestać brakować połączeń? Dlaczego tak się dzieje? Monitoruję mój ruch w Google Analytics w czasie rzeczywistym, a gdy liczba użytkowników przekracza 120, mój php-fpm.log jest pełen tych ostrzeżeń.
(free/mem_per_worker)+150
, gdziefree
jest ilość pamięci, którą będziesz mieć po uwzględnieniu potrzeb innych procesów, których wymagania pamięci wzrosną wraz z większym obciążeniem, imem_per_worker
jest to maksymalna ilość pamięci, którą przewidujesz każdy proces roboczy PHP wymagający.Na naszych serwerach mieliśmy ten sam problem.
Możesz spróbować odrodzić proces potomny co X żądań, aby uniknąć wycieków pamięci. Działa dobrze w Apache i FPM, zaczyna też dobrze działać.
Spowoduje to ponowne uruchomienie procesu potomnego co 50 000 żądań
źródło