PHP-FPM参数调优

  • 配置文件位置一般在PHP目录下的etc/php-fpm.d/*.conf

服务器配置

  • 2核2G

调优参数建议

pm.max_children = 100

最大子进程数量,越多越好,一般每个php-cgi所耗费的内存为20M左右
如果最大数量设置为100,则在峰值的时候php-cgi所耗内存在2000M以内
如果这个值设置的比较小,那么等待的请求时间会出现502超时
4G内存服务器可以设置成200

pm.start_servers = 20

pm.start_servers:启动时创建的子进程数,10~20之间就可以,20个的话是400M内存

pm.max_requests = 10240

为避免内存泄露,php-fpm有这么一个机制,当一个php-cgi进程处理的请求数达到这个配置后,则会自动重启该进程
所以在高并发中,经常导致502错误
解决方法就是把这个值设置大一些,减少进程重启次数,减少高并发情况下502错误。

request_terminate_timeout = 400

单个请求的超时中止时间,超时后会终止进程,nginx发现信号断了,就会给客户端返回502错误。
和php.ini的max_execution_time配置不冲突,谁先达到时间谁先起作用。
由于程序中有请求第三方接口等待,所以建议这个值设置为400秒,长一点不会出现502错误

pm.min_spare_servers = 10

保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程

pm.max_spare_servers = 30

保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

rlimit_files = xxx

设置文件打开描述符的rlimit限制,可使用 ulimit -n 查看

  • 其他:pm.status_path = /status
    可以用来查看php-fpm运行情况,配置打开后再在nginx进行代理转发,就可以在浏览器访问了
    /status显示的参数意义:
    • pool – fpm池子名称,大多数为www
    • process manager – 进程管理方式,值:static, dynamic or ondemand. dynamic
    • start time – 启动日期,如果reload了php-fpm,时间会更新
    • start since – 运行时长
    • accepted conn – 当前池子接受的请求数
    • listen queue – 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
    • max listen queue – 请求等待队列最高的数量
    • listen queue len – socket等待队列长度
    • idle processes – 空闲进程数量
    • active processes – 活跃进程数量
    • total processes – 总进程数量
    • max active processes – 最大的活跃进程数量(FPM启动开始算)
    • max children reached - 进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。
    • slow requests – 启用了php-fpm slow-log,缓慢请求的数量
  • 还可以在访问时,在网址后面追加?full,可以查看更详细的状态,参数值有:
    • pid – 进程PID,可以单独kill这个进程.
    • state – 当前进程的状态 (Idle, Running, …)
    • start time – 进程启动的日期
    • start since – 当前进程运行时长
    • requests – 当前进程处理了多少个请求
    • request duration – 请求时长(微妙)
    • request method – 请求方法 (GET, POST, …)
    • request URI – 请求URI
    • content length – 请求内容长度 (仅用于 POST)
    • user – 用户 (PHP_AUTH_USER) (or ‘-’ 如果没设置)
    • script – PHP脚本 (or ‘-’ if not set)
    • last request cpu – 最后一个请求CPU使用率。
    • last request memorythe - 上一个请求使用的内存

nginx转发配置:

location /status {                fastcgi_pass 127.0.0.1:9000;                include fastcgi_params;                fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;}

其他:ping.path = /ping
用于外部检测FPM是否存活并且可以响应请求

nginx转发配置:

location /ping {                    fastcgi_pass 127.0.0.1:9000;                    include fastcgi_params;                    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;}

注:macOS系统对进程数、打开文件数等等有限制,为了方便操作,直接在Linux下测试。

修改配置后重载配置文件:

service php-fpm restart

参考文章

  1. https://blog.csdn.net/u012628581/article/details/92662291
  2. https://www.cnblogs.com/kenshinobiy/p/7470674.html

更多相关文章

  1. python入门教程12-03 (python语法入门之进程)
  2. Nodejs进程间通信
  3. 一文看懂 Node.js 中的多线程和多进程[每日前端夜话0x107]
  4. 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
  5. 68.查看子进程脚本
  6. 使用后台进程和 Shutdown Hook 友好地关闭 Tomcat
  7. php 多进程 父进程的阻塞与非阻塞
  8. 如何在数组中存储产品数量
  9. php多进程处理

随机推荐

  1. 芋道 Spring Boot MyBatis 入门(二)之 MyBa
  2. 在 JavaScript 中对象的深拷贝(及其工作原
  3. Android(安卓)存储之文件存储
  4. 企业级JavaScript:机遇,威胁与解决方案[每
  5. 『互联网架构』软件架构-软件环境的持续
  6. 互联网发展的四个阶段
  7. Spring Data JPA 最佳实践
  8. 芋道 Spring Boot MyBatis 入门(三)之 MyBa
  9. 芋道 Spring Boot 缓存 Cache 入门
  10. Map 集合怎么也有这么多坑?一不小心又踩了