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

posted @ 2018-12-26 16:32  GT.Yao  阅读(280)  评论(0编辑  收藏  举报