php5-fpm maximiza todos os núcleos (nginx+php5fpm+wordpress)

php5-fpm maximiza todos os núcleos (nginx+php5fpm+wordpress)

Temos um linode de 16 GB rodando com 8 núcleos de CPU e estou tentando depurar um problema que quando tento um teste de carga o servidor começa a pirar em torno de 250 solicitações por segundo em um site wordpress bastante básico. Estou apenas acessando a primeira página do site, para sua informação.

Quando eu faço login no servidor e vejo as estatísticas do servidor no Htop, vejo todos os núcleos vinculados e uma carga de processos php5-fpm. Após a conclusão do teste, esses processos ainda existem e eventualmente terei que reiniciar o php-fpm para trazer o servidor de volta ao funcionamento.

Eu vi isso no log hoje ao fazer o teste de carga.

[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

Então, obviamente, algo está errado, simplesmente não sou especialista em ajustar essas configurações para o sistema atual que temos.

Aqui está nosso 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

Algum conselho ou algo a apontar no www.conf?

Responder1

Primeiro, você realmente deveria se perguntar: 250 req/segundo é algo que seu site realmente deveria ser capaz de suportar? São MUITOS pedidos para uma página. Francamente, acho que o máximo de 250req/s da sua CPU é normal, dado o que você tem – um sistema virtualizado.

pm.max_children = 150

Você provavelmente continuou levantando isso porque continua recebendo erros ao dizer que está no limite das crianças. Mas na verdade você está dando um tiro no próprio pé quando eleva isso além do que seu sistema pode suportar. É melhor NÃO aceitar uma próxima solicitação que ela não possa atender do que aceitar. Aumentar isso não apenas reduz o seu sistema, mas também cria mais requisitos de recursos e também mais sobrecarga. E quando isso explode a um tamanho que seu sistema não consegue mais suportar, cria sinais como congelamento. Não sei exatamente o que o seu VPS está oferecendo (e você nunca saberá, pois não é estático, pois depende de outros usuários no nó), mas eu diria pessoalmente que qualquer coisa acima de 20 para o seu sistema especificado é um não cenário realista.

Você também deve ajustar o sobressalente inicial/min/máx de acordo, pois ter filhos maiores que o máximo não faz sentido. Ou você pode simplesmente não se preocupar com isso e definir como pm = static.

Responder2

Mude o gerenciamento de processos para ondemand

pm = ondemand

informação relacionada