Nginx und PHP-FPM haben keine Verbindungen mehr

9

Ich stoße immer wieder auf solche Fehler.

[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

Ich habe meine Einstellungen für php-fpm auf diese geändert,

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

Ergebend

[02-Jun-2012 01:39:19] WARNING: [pool www] server reached pm.max_children setting (150), consider raising it

Ich habe gerade eine neue Website gestartet, auf der eine beträchtliche Menge an Verkehr herrscht. Dieser Datenverkehr ist legitim und Benutzer erhalten 504 Gateway-Zeitüberschreitungen, wenn das Limit erreicht ist.

Ich habe mit IPTABLES nur begrenzte Verbindungen zu meinem Server und führe fail2ban aus und verfolge die Nginx-Zugriffsprotokolle. Der Verkehr ist alles legitim, ich habe gerade keinen Platz mehr für Benutzer.

Ich laufe derzeit auf einer Dual-Core-Box mit Ubuntu 64bit.

free
             total       used       free     shared    buffers     cached
Mem:       6114284    5726984     387300          0     141612    4985384
-/+ buffers/cache:     599988    5514296
Swap:       524284       5804     518480

Meine php.ini max_input_time = 60

Meine Nginx-Konfiguration ist

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;
}

Was kann ich tun, um keine Verbindungen mehr zu haben? Warum tritt das immer wieder auf? Ich überwache meinen Datenverkehr in Google Analytics in Echtzeit und wenn die Anzahl der Nutzer über 120 liegt, ist mein php-fpm.log voll von diesen Warnungen.

E3pO
quelle

Antworten:

5

Haben Sie darüber nachgedacht, den guten Ratschlägen in der Protokollnachricht zu folgen und den Wert von zu erhöhen pm.max_children? Sie haben jede Menge freien RAM, um sie unterzubringen.

So beantworten Sie Ihre Fragen:

  • Was kann ich tun, um keine Verbindungen mehr zu haben? Stellen Sie mehr Verbindungen bereit oder reduzieren Sie die Anzahl der Verbindungen, die Sie erhalten.
  • Warum tritt das immer wieder auf? Weil Ihnen immer wieder die Verbindungen ausgehen.
womble
quelle
Entschuldigung, dieser Fehler wurde mit einem Zeitstempel versehen, nachdem ich ihn von 100 auf 150 aktualisiert hatte. Ja, das habe ich. Auf welche Einstellung sollte ich sie für alle meine RAMs einstellen?
E3pO
Sie sollten es auf erhöhen (free/mem_per_worker)+150, wo freesich die Speichermenge befindet, die Sie haben, nachdem Sie die Anforderungen anderer Prozesse berücksichtigt haben, deren Speicherbedarf mit zunehmender Auslastung zunimmt. Dies mem_per_workerist die maximale Speichermenge, die Sie für jeden PHP-Worker-Prozess benötigen.
womble
4

Wir hatten das gleiche Problem auf unseren Webservern.

Sie können versuchen, den untergeordneten Prozess bei jeder X-Anforderung erneut zu starten, um Speicherverluste zu vermeiden. In Apache und FPM hat es gut funktioniert, es beginnt auch gut zu funktionieren.

 pm.max_requests = 50000

Dadurch wird alle 50.000 Anforderungen ein untergeordneter Prozess neu gestartet

Ali Alwash
quelle