修改php-fpm.conf配置文件
配置文件的存储路径是具体根据不同安装方法有所不同(或许文件名也不同)。
通过运行命令查看pool named和user:

ps aux|grep php-fpm

在配置文件里面可以看到如下配置选项:


; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives. With this process management, there will be
;             always at least 1 children.
;             pm.max_children      - the maximum number of children that can
;                                    be alive at the same time.
;             pm.start_servers     - the number of children created on startup.
;             pm.min_spare_servers - the minimum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is less than this
;                                    number then some children will be created.
;             pm.max_spare_servers - the maximum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is greater than this
;                                    number then some children will be killed.
;  ondemand - no children are created at startup. Children will be forked when
;             new requests will connect. The following parameter are used:
;             pm.max_children           - the maximum number of children that
;                                         can be alive at the same time.
;             pm.process_idle_timeout   - The number of seconds after which
;                                         an idle process will be killed.
; Note: This value is mandatory.
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.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 50

; 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 = 5

; 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 = 5

; 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.max_spare_servers = 20 (默认是35)。
因为当 pm = dynamic 的时候 pm.max_spare_servers 就是决定该状态下的最大的 php-fpm 进程数量。通过控制数量来决定允许运行最大内存。
使用命令重启php-fpm:

systemctl restart php-fpm

服务器实例:
CPU: 1核 内存:1 GB

通过Load Impact https://loadimpact.com/ 来测试网站(免费用户每月有5次测试机会)。
我这里设置50个虚拟访客(virtual users in 5 mins)
可以看到当达到42个访客时,网站加载时间开始急速变慢。

查看该时段CPU使用率达到99.87%

同时测试期间(总时间5分钟)内存由33%直线上升到极限(合计消耗掉大约660MB)由于设定了pm.max_spare_servers = 20当CPU满载时候,内存(包含php-fpm进程使用)被限制最大不超过70%。如果提升pm.max_spare_servers的数量,最大使用内存也被提升。只有合理的pm.max_spare_servers设置数量,搭配CPU运行起来才能达到服务器的最优状态。