zoukankan      html  css  js  c++  java
  • php-fpm优化

    一.php-fpm 进程设置

    php-fpm进程池开启进程有两种方式,一种是static,直接开启指定数量的php-fpm进程,不再增加或者减少;
    另一种则是dynamic,开始时开启一定数量的php-fpm进程,当请求量变大时,动态的增加php-fpm进程数到上限,当空闲时自动释放空闲的进程数到一个下限。

    动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗

     

    几个参数设置:

    pm = dynamic   //pm参数指定了进程管理方式,有两种可供选择:static或dynamic,从字面意思不难理解,为静态或动态方式
    
    pm.max_children = 100   //static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量,pm.max_spare_servers的值只能小于等于pm.max_children
    
    
    pm.start_servers = 3  //动态方式下的起始php-fpm进程数量
    
    
    pm.min_spare_servers = 1   //动态方式下服务器空闲时最小php-fpm进程数量
    
    
    pm.max_spare_servers = 5   //动态方式下服务器空闲时最大php-fpm进程数量

     

    参数设置建议:一般php-fpm进程占用20~30m左右的内存就按30m算。如果单独跑php-fpm,动态方式起始值可设置物理内存Mem/30M,由于大家一般Nginx、MySQL都在一台机器上,于是预留一半给它们,即php-fpm进程数为$Mem/2/30。

    二.超时时间设置 max_execution_time(php.ini) 与 request_terminate_timeout(php-fpm)

     php脚本超时时间可以在php.ini的max_execution_time和fpm.conf的request_terminate_timeout参数两处进行设置.那么这两者有什么区别呢?

    当我们设置php.ini的max_execution_time参数后,zend引擎处理脚本时,其内部会根据设定的时间定义一个定时器(setitimer),这是linux的API。

    而fpm.confrequest_terminate_timeout的检测是通过主进程遍历定时事件fpm_pctl_heartbeat来判断PHP脚本执行是否超时。

    php.ini中的max_execution_time:

    这个值限定了脚本的最大执行时间(单位是秒) 

    set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。在测量时间是实值的Windows中,情况就不是如此了。

    php-fpm.conf中的request_terminate_timeout

     

    设置单个请求的超时中止时间。该选项可能会对 php.ini 设置中的 max_execution_time 因为某些特殊原因没有中止运行的脚本有用。设置为 ‘0’ 表示 ‘Off’。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。

    通过上面两个说明及实验验证得出结论,max_execution_time=1,不一定1s后就会中止脚本,可能是2s、3s甚至更长的时间;而request_terminate_timeout=4则就会在4s后中止脚本的执行。所以在配置超时时间的时候,最好两个都配置,max_execution_time时间短一点,而request_terminate_timeout时间长一点

    三.开启慢日志

    开启慢日志的目的是为了跟踪分析那条php脚本执行的时间超过了设置的request_slowlog_timeout时长,如果超过这个设置时间,那么该脚本就会被记录下

     

    slowlog = log/$pool.log.slow

    request_slowlog_timeout = 2

     开启php-fpm的慢日志,时间阀值2秒;

     

    四.php-fpm启动、重启、终止

    PHP5.3.3后的php-fpm 不再支持php-fpm 以前具有的 /usr/local/php/sbin/php-fpm(start|stop|reload)等命令,需要使用信号控制:

     

    master进程可以理解以下信号

    INT, TERM 立刻终止
;

    QUIT 平滑终止
;

    USR1 重新打开日志文件
;

    USR2平滑重载所有worker进程并重新载入配置和二进制模块 ;

     

     

    先查看php-fpm的master进程号

    ps aux|grep php-fpm

    重启php-fpm:

    # kill -USR2 1392

    上面方案一般是没有生成php-fpm.pid文件时使用,如果要生成php-fpm.pid,使用下面这种方案:

    上面master进程可以看到,matster使用的是/usr/local/php/etc/php-fpm.conf这个配置文件,cat /usr/local/php/etc/php-fpm.conf 发现:

    [global]
    ; Pid file
    ; Note: the default prefix is /usr/local/php/var
    ; Default Value: none
    ;pid = run/php-fpm.pid

     

    pid文件路径应该位于/usr/local/php/var/run/php-fpm.pid,由于注释掉,所以没有生成,我们把注释去除,再kill -USR2 42891 重启php-fpm,便会生成pid文件,下次就可以使用以下命令重启,关闭php-fpm了:

    php-fpm 关闭:
    kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'
    php-fpm 重启:
    kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

     

     

    参考:

    https://www.zybuluo.com/phper/note/89081

    http://blog.itpub.net/14184018/viewspace-1797411/

    https://www.cnblogs.com/kenshinobiy/p/7470635.html

    https://blog.csdn.net/wzx19840423/article/details/79071928

    https://blog.csdn.net/mijar2016/article/details/53709777

  • 相关阅读:
    顺序表(线性表)操作的思想及实现之C#版
    基于CXF Java 搭建Web Service
    敏捷方法 – 灵活,可靠的软件 使用设计模式和敏捷开发
    使用HttpHanlder处理404: File not found
    关于js模块加载的尝试
    Tfs 自动部署 部署图
    jQuery能做到,PHP能做到,C#也能做到
    优化反射性能的总结(下)
    推荐系统
    10个前端开发必备的工具或使用方法
  • 原文地址:https://www.cnblogs.com/ygtup/p/10179905.html
Copyright © 2011-2022 走看看