У нас есть 16-гигабайтный линод, работающий с 8 ядрами процессора, и я пытаюсь отладить проблему, из-за которой, когда я пытаюсь выполнить нагрузочный тест, сервер начинает выводить примерно 250 запросов в секунду на довольно простом сайте WordPress. Я попал только на первую страницу сайта, к сожалению.
Когда я вхожу на сервер и просматриваю статистику сервера на 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?
Во-первых, вы действительно должны задать себе вопрос: действительно ли 250 запросов в секунду должен выдерживать ваш сайт? Это МНОГО запросов на страницу. Откровенно говоря, я думаю, что максимальная скорость вашего процессора 250 запросов / с - это нормально, учитывая то, что у вас есть - виртуализированная система.
pm.max_children = 150
Вы, вероятно, продолжали поднимать это, потому что продолжаете получать ошибку, говоря, что у вас больше нет детей. Но на самом деле вы стреляете себе в ногу, когда поднимаете ее сверх того, с чем может справиться ваша система. Лучше НЕ принимать следующий запрос, который он не может обработать, чем принять. Увеличение этого не только делает вашу систему более тонкой, но и создает больше требований к ресурсам, а также увеличивает накладные расходы. И когда это взрывается до размеров, с которыми ваша система больше не может справиться, это создает такие признаки, как зависание. Я не знаю точно, что дает вам ваш VPS (и вы никогда не узнаете, поскольку он не статичен, поскольку зависит от других пользователей в узле), но я бы лично сказал, что все, что выше 20 для вашей указанной системы, не является реалистичный сеттинг.
Вы также должны соответствующим образом отрегулировать start / min / max запасные, поскольку иметь потомков больше, чем max, не имеет смысла. Или вы можете просто не беспокоиться об этом и установить pm = static
.
Изменить управление процессами на ondemand
pm = ondemand