web-dev-qa-db-ja.com

php5-fpmはすべてのコアを最大化します(nginx + php5fpm + wordpress)

8つのCPUコアで実行されている16ギガのlinodeがあり、負荷テストを試みると、サーバーがかなり基本的な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

したがって、明らかに何かがfubarです。私は、現在のシステム用にこれらの設定を微調整する専門家ではありません。

これが私たちの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で指摘するアドバイスや何かはありますか?

3
Steve

最初に、あなたは本当にあなた自身に質問をするべきです:あなたのサイトが本当に処理できるべきである250req /秒は何かですか?それはページに対するたくさんのリクエストです。率直に言って、仮想化システムである仮想化システムを考えると、CPUを最大化する250req/sは正常だと思います。

pm.max_children = 150

あなたはおそらくあなたが子供に限界があると言ってエラーを受け取り続けるのでこれを上げ続けました。しかし、これをシステムが処理できる範囲を超えて上げると、実際には足を撃ちます。受け入れるよりも、処理できない次のリクエストを受け入れない方がよいでしょう。これを増やすと、システムが薄くなるだけでなく、より多くのリソース要件とオーバーヘッドが発生します。そして、それが爆発してシステムが処理できないサイズになると、凍結のような兆候が現れます。あなたのVPSがあなたに何を与えているのか正確にはわかりません(そしてそれはノード内の他のユーザーに依存するので静的ではないのであなたは決してわかりません)、しかし私はあなたの指定されたシステムの20を超えるものはそうではないと個人的に言います現実的な設定。

また、それに応じて開始/最小/最大スペアを調整する必要があります。最大値を超える子を持つことは意味がないためです。または、心配する必要がなく、pm = staticに設定することもできます。

1
Grumpy

プロセス管理をオンデマンドに変更する

pm = ondemand
0
Sibin Grasic