php5-fpm nutzt alle Kerne voll aus (nginx+php5fpm+wordpress)

php5-fpm nutzt alle Kerne voll aus (nginx+php5fpm+wordpress)

Wir haben einen 16-GB-Linode mit 8 CPU-Kernen am Laufen und ich versuche, ein Problem zu debuggen: Wenn ich einen Belastungstest durchführe, gerät der Server bei etwa 250 Anfragen pro Sekunde auf einer ziemlich einfachen WordPress-Site in Panik. Ich erreiche nur die Startseite der Site, nur zur Info.

Wenn ich mich beim Server anmelde und die Serverstatistiken auf Htop ansehe, sehe ich, dass alle Kerne belegt sind und eine Unmenge an php5-fpm-Prozessen vorhanden ist. Nachdem der Test abgeschlossen ist, sind diese Prozesse immer noch vorhanden und ich muss php-fpm schließlich neu starten, um den Server wieder zum Laufen zu bringen.

Ich habe dies heute im Protokoll gesehen, als ich den Belastungstest durchgeführt habe.

[23-Dec-2013 12:19:03] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 27 total children
[23-Dec-2013 12:19:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 35 total children
[23-Dec-2013 12:19:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 45 total children
[23-Dec-2013 12:19: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 0 idle, and 55 total children
[23-Dec-2013 12:19:07] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 65 total children
[23-Dec-2013 12:19:08] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 75 total children
[23-Dec-2013 12:19:19] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 5 idle, and 93 total children

Da stimmt offensichtlich etwas nicht, ich bin nur kein Experte darin, diese Einstellungen für unser aktuelles System zu optimieren.

Hier ist unsere www.conf

; Start a new pool named 'www'.
; the variable $pool can we used in any directive and will be replaced by the
; pool name ('www' here)
[www]

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

; Set listen(2) backlog. A value of '-1' means unlimited.
; Default Value: 128 (-1 on FreeBSD and OpenBSD)
listen.backlog = 65536

pm = dynamic

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don't
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 150
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 20
; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 10
; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 35
; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
;pm.process_idle_timeout = 10s;

; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
pm.max_requests = 500

pm.status_path = /status-www

; The log file for slow requests
; Default Value: not set
; Note: slowlog is mandatory if request_slowlog_timeout is set
;slowlog = log/$pool.log.slow
slowlog = /var/log/php-fpm-slow.log

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_slowlog_timeout = 115s

; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_terminate_timeout = 120s

; Set open file descriptor rlimit.
; Default Value: system defined value
rlimit_files = 65536

; Set max core size rlimit.
; Possible Values: 'unlimited' or an integer greater or equal to 0
; Default Value: system defined value
rlimit_core = 0

Gibt es einen Rat oder einen Hinweis zu www.conf?

Antwort1

Zunächst sollten Sie sich wirklich die Frage stellen: Ist 250 Anfragen/Sekunde etwas, das Ihre Site wirklich bewältigen kann? Das sind eine MENGE Anfragen für eine Seite. Ehrlich gesagt denke ich, dass 250 Anfragen/Sekunde, die Ihre CPU maximal belasten, normal sind, wenn man bedenkt, was Sie haben – ein virtualisiertes System.

pm.max_children = 150

Sie haben diesen Wert wahrscheinlich immer wieder erhöht, weil Sie immer wieder eine Fehlermeldung erhalten, die besagt, dass Sie die maximale Anzahl an untergeordneten Elementen erreicht haben. Aber Sie schießen sich eigentlich selbst ins Bein, wenn Sie diesen Wert über das hinaus erhöhen, was Ihr System verarbeiten kann. Es ist besser, eine nächste Anfrage, die es nicht verarbeiten kann, NICHT anzunehmen, als sie anzunehmen. Wenn Sie diesen Wert erhöhen, wird Ihr System nicht nur dünner, Sie erzeugen auch mehr Ressourcenbedarf und mehr Overhead. Und wenn dieser Wert auf eine Größe anwächst, die Ihr System nicht mehr verarbeiten kann, treten Anzeichen wie Einfrieren auf. Ich weiß nicht genau, was Ihr VPS Ihnen bietet (und Sie werden es nie erfahren, da es nicht statisch ist, sondern von anderen Benutzern im Knoten abhängt), aber ich würde persönlich sagen, dass alles über 20 für Ihr angegebenes System keine realistische Einstellung ist.

Sie sollten auch Start/Min/Max-Ersatz entsprechend anpassen, da es keinen Sinn ergibt, mehr als die maximalen Kinder zu haben. Oder Sie können sich einfach keine Gedanken darüber machen und auf einstellen pm = static.

Antwort2

Prozessmanagement auf OnDemand umstellen

pm = ondemand

verwandte Informationen