Configuration

首先需要确定影响 php-fpm 子进程数的几个配置项。

# 设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。必须设置。
# static - 子进程的数量是固定的(pm.max_children)。
# ondemand - 进程在有需求时才产生(当请求时才启动。与 dynamic 相反,在服务启动时 pm.start_servers 就启动了。
# dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。
pm string

# pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。必须设置。
pm.max_children int

# 设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。
pm.start_servers int

# 设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。必须设置。
pm.min_spare_servers int

#设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。必须设置。
pm.max_spare_servers int

#秒数,多久之后结束空闲进程。 仅当设置 pm 为 ondemand。 可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:10s。
pm.process_idle_timeout mixed

#设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0。
pm.max_requests int

Question

了解了几个配置项之后,在进行php-fpm子进程数配置调整之前, 还需要搞清楚两个问题:

1. 每个 php-fpm 子进程平均占用多少内存?
2. 当前 website 所在的服务器有多少空余内存资源可供 php-fpm 使用?

Explain

查看每个php-fpm子进程平均占用内存

[~]# ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }'
46Mb

查看系统当前空余内存

[ ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        210M        938M        404K        2.6G        3.2G
Swap:            0B          0B          0B

demo1

在设置pm是static的时候,php-fpm 子进程最大数量受 pm.max_children 影响,建议设置为 M/m*1.2 , M是系统可用内存资源, m是子进程平均占用内存。

系统空余内存 3.2 时, 假如存在其他服务,保留1G其他服务使用, 理想可用内存为 3.2-1-0.5 = 1.7G 。

pm.max_children = 1.7x1024/(46x1.2) = 31

pm static
pm.max_children 31
pm.max_request = 1000

demo2

当设置pm是dynamic时,受 pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers 影响 。

pm.max_children = 31
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_request = 1000

参考资料:

  1. 《FastCGI 进程管理器(FPM)配置》 --- php.net
  2. 《PHP-FPM子进程数量应该如何设置?》 --- SegmentFault 思否
  3. 《Determining the correct number of child processes for PHP-FPM on NGinx》 --- Kinamo
  4. 《Adjusting child processes for PHP-FPM (Nginx)》 --- github

标签: none

添加新评论