/ php

php-fpm

配置文件常见路径:

  • /etc/php-fpm.d/www.conf
  • /etc/opt/remi/php71/php-fpm.d/www.conf

运行身份

默认 php-fpm 的运行身份为 apache,但是 Nginx 运行的用户身份是 nginx,所以需要将 php-fpm 的 user 和 group 都更改为 nginx

如果开发环境为 vagrant,可以配置 Vagrantfile:

config.vm.synced_folder "../Sites", "/var/www", owner:'vagrant', group: 'nginx'

owner 不是 nginx,而设置为 vagrant,是为了方面手动在项目下执行 composer 命令。

生产环境下建议统一改为 deploy

子进程数量

pm.max_children = 100

  • 这个值原则上是越大越好,php-cgi 的进程多了就会处理的很快,排队的请求就会很少。

  • 设置”max_children”也需要根据服务器的性能进行设定

  • 一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右

  • 假设“max_children”设置成100个,20M*100=2000M

  • 也就是说在峰值的时候所有PHP-CGI所耗内存在2000M以内。

  • 假设“max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。

  • 如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

  • 被测服务器,本地虚拟机 1GB/1Core,空闲的内存 600MB

查看系统可用内存:

➜  ~ free -m
              total        used        free      shared  buff/cache   available
Mem:           1839         241        1285          25         311        1411
Swap:          1535           0        1535

可以先用 ab -c 1 -n 100 预热下,然后获取单个 PHP-FPM 进程的平均内存使用情况:

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

即,平均每个 PHP-FPM 进程占用内存为 12MB

确认并发数:

  • 被测应用,每个请求 12 MB,PHP-FPM 进程池最多 100 个子进程( 117.58= 1411MB / 12MB)。即 。
  • PHP-FPM 配置 /etc/php-fpm.d/www.conf 中的 pm.max_children = 100,注意,这里就是压测的最大并发数受限于机器内存
  • 需要注意的是PHP 配置 /etc/php.ini 中的 memory_limit 是一个脚本能使用的最大内存,和这里没有直接关系。

pm.max_children = 最大并发数

pm.max_children 表示 php-fpm 能启动的子进程的最大数量。因为 php-fpm 是多进程单线程同步模式,即一个子进程同时最多处理一个请求,所以子进程数等于最大并发数。

相关文章: