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

3

Temos um linode de 16 gig rodando com núcleos de 8 cpu e estou tentando depurar um problema que quando eu tento um teste de carga que o servidor começa a surtar em torno de 250 pedidos por segundo em um site wordpress bem básico. Eu estou apenas batendo na primeira página do site fyi.

Quando eu faço login no servidor e vejo as estatísticas do servidor no Htop, vejo todos os núcleos indexados e uma carga de lixo de processos php5-fpm. Depois que o teste é feito, esses processos ainda existem e eu eventualmente tenho que reiniciar o php-fpm para trazer o servidor de volta ao vivo.

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 é fubar, eu não sou especialista em ajustar essas configurações para o sistema atual que temos.

Aqui está o 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 para apontar com o www.conf?

    
por Steve 23.12.2013 / 21:51

2 respostas

1

Primeiro, você realmente deveria se perguntar: é 250 req / segundo algo que seu site realmente deveria ser capaz de manipular? Isso é um monte de pedidos de uma página. Francamente, acho que 250 req / s maximizando sua CPU é normal, dado o que você tem - um sistema virtualizado.

pm.max_children = 150

Você provavelmente continuou aumentando isso porque você continua recebendo erros dizendo que você está no máximo com as crianças. Mas você está realmente atirando no pé quando eleva isso além do que seu sistema pode suportar. É melhor NÃO aceitar um próximo pedido que ele não pode manipular do que aceitar. Aumentar isso não só diminui o seu sistema, como também cria mais requisitos de recursos e mais sobrecarga. E quando isso explode em um tamanho que seu sistema não pode mais manipular, ele cria sinais como o congelamento. Eu não sei exatamente o que seu VPS está lhe dando (e você nunca saberá, já que não é estático, pois depende de outros usuários no nó), mas eu pessoalmente diria que qualquer coisa acima de 20 para o seu sistema especificado é um não cenário realista.

Você também deve ajustar start / min / max spare de forma que ter filhos maiores que max não faz sentido. Ou você pode simplesmente não se preocupar com isso e definir como pm = static .

    
por 24.12.2013 / 07:17
0

Altere o gerenciamento de processos para ondemand

pm = ondemand
    
por 26.12.2013 / 00:35