php5-fpm максимально использует все ядра (nginx+php5fpm+wordpress)

php5-fpm максимально использует все ядра (nginx+php5fpm+wordpress)

У нас есть 16-гигабайтный линоуд, работающий с 8 ядрами процессора, и я пытаюсь отладить проблему, когда я пробую нагрузочный тест, сервер начинает сходить с ума около 250 запросов в секунду на довольно простом сайте WordPress. Я попадаю только на главную страницу сайта, fyi.

Когда я захожу на сервер и просматриваю статистику сервера на Htop, я вижу, что все ядра загружены и куча процессов php5-fpm. После завершения теста эти процессы все еще существуют, и мне в конечном итоге приходится перезапускать php-fpm, чтобы снова запустить сервер.

Я увидел это в журнале сегодня, когда проводил нагрузочный тест.

[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

Очевидно, что-то не так, просто я не эксперт в настройке этих параметров для текущей системы, которая у нас есть.

Вот наш 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

Есть ли какие-нибудь советы или замечания по поводу www.conf?

решение1

Во-первых, вам действительно стоит задать себе вопрос: 250 запросов в секунду — это то, что ваш сайт действительно должен уметь обрабатывать? Это МНОГО запросов для страницы. Честно говоря, я думаю, что 250 запросов в секунду, которые загружают ваш процессор, — это нормально, учитывая то, что у вас есть — виртуализированная система.

pm.max_children = 150

Вероятно, вы продолжали повышать это значение, потому что постоянно получаете сообщение об ошибке, сообщающей о том, что вы достигли максимального количества детей. Но на самом деле вы стреляете себе в ногу, когда повышаете это значение сверх того, что может обработать ваша система. Лучше НЕ принимать следующий запрос, который она не может обработать, чем принимать. Увеличение этого значения не только истончает вашу систему, вы создаете больше требований к ресурсам, а также больше накладных расходов. И когда это достигает размера, с которым ваша система больше не может справиться, это создает такие признаки, как зависание. Я не знаю точно, что дает вам ваш VPS (и вы никогда не узнаете, поскольку он не статичен, а зависит от других пользователей в узле), но я бы лично сказал, что все, что выше 20 для вашей указанной системы, является нереалистичным параметром.

Вам также следует настроить начальный/мин/макс запас соответственно, поскольку иметь больше, чем макс детей, не имеет смысла. Или вы можете просто не беспокоиться об этом и установить pm = static.

решение2

Изменение управления процессами на ondemand

pm = ondemand

Связанный контент