php-fpm参数配置的一些问题记录

1.Php进程数查看

ps -ef | grep php | awk ‘{print $1}’ | sort -n | uniq -c | sort -n ---->查看php的进程数和用户

2.Php-fpm配置文件

php-fpm全名是PHP FastCGI进程管理器
php-fpm启动后会先读php.ini,然后再读相应的conf配置文件(一般我们可以在安装目录中找到:/usr/local/php/etc/php-fpm.conf(一般为全局配置说明),如果没有的话,那就可能在/usr/local/php/etc/php-fpm.d/*.conf(一般这里的为进程池的配置)),conf配置可以覆盖php.ini的配置。
启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。
当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;
这个存放待accept的半连接的队列有多长,由 listen.backlog 配置。

1、listen.backlog = 65535

#未accept处理的socket队列大小,-1 on FreeBSD and OpenBSD,其他平台默认65535,高并发时重要,合理设置会及时处理排队的请求;太大会积压太多,处理完后nginx在前面都等超时断开这个和fpm的socket连接了,就杯具了。不要用-1(-1表示无限制,由操作系统决定),建议1024以上,最好是2的幂值。
#最大数量受限于系统配置 cat /proc/sys/net/core/somaxconn,系统配置修改:
vim /etc/sysctl.conf,增加 net.core.somaxconn = 2000 则最大为2000,然后php最大的backlog可以到2000。

backlog配置问题

一个fpm子进程在同一时间只能处理一个请求,如果,backlog设置得过大,nginx之类的客户端发起的请求一直没有fpm子进程进行accept,nginx就会直接断掉这个连接,等fpm忙过来了再去accept的时候,就会发现断开了,于是报错。backlog设置得过小,访问量大时fpm子进程全部处于忙碌状态,backlog也塞满了,就会拒绝新的连接,此时nginx再请求,就会直接被拒。所以需要合理的设置backlog参数。
大部分参数只要系统默认的就可以了,我们只需要知道几个比较重要的参数设置,什么时候用到可以回头查询相关说明

3.php-fpm.conf参数配置

一般这些参数会在线程池的配置文件单独配置(即/usr/local/php/etc/php-fpm.d/*.conf这个文件中)
php-fpm.conf有两个至关重要的参数:一个是”max_children”,另一个是”request_terminate_timeout”.
pm = dynamic
pm = dynamic #启动时子进程管理方式,可选值:static(启动时创建指定个数), dynamic(启动时根据情况创建,至少有一个), ondemand(启动时不创建子进程,有需求才创建)
pm:设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。
dynamic表示php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。
static表示php-fpm进程数是静态的, 进程数自始至终都是pm.max_children指定的数量,不再增加或减少。
max_children(两个作用:静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进程数)
对于内存大的服务器(比如8G以上)来说,建议指定静态的max_children值(即pm = static),因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

pm.max_children:静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进程数(这里要注意pm.max_spare_servers的值只能小于等于pm.max_children)
pm.start_servers:动态方式下的起始php-fpm进程数量。(可以为.max_children的60%)
pm.min_spare_servers:动态方式空闲状态下的最小php-fpm进程数量。(可以为.max_children的50%)
pm.max_spare_servers:动态方式空闲状态下的最大php-fpm进程数量。(可以为.max_children的90%或者等于max_children的值)

注意:

  • 要求pm.start_servers的值在pm.min_spare_servers和pm.max_spare_servers之间
  • 如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启参数设置数量的php-fpm进程。
  • 如果dm设置为dynamic,4个参数都生效。系统会在php-fpm运行开始时启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。
slowlog = var/log/$pool.log.slow 

#PHP文件执行过慢的日志,会准确的记录具体哪一行代码太慢,这个非常有用,在设置了时间时生效。

request_slowlog_timeout = 2s

#超过这个运行时间就会写慢日志

慢查询日志统计分析:

php-fpm参数配置的一些问题记录_第1张图片

统计入口脚本文件
grep “^script_filename” www.log.slow|sort|uniq -c |sort -nr
统计函数 ----不算"^script_filename" 行
grep “^[0x” www.log.slow | cut -d " " -f 3,2 | sort | uniq -c | sort -k 1 -nr | head -n 10
说明:[ 需要转移,所以加上
或者
grep -F “[0x” www.log.slow | cut -d " " -f 3,2 | sort | uniq -c | sort -k 1 -nr | head -n 10
说明: -F 表示把""里面的东西当成一个完整的字符串
cut -d " " -f 2,3 : 以空格作为分隔符,取第三段和第2段
sort: 对单词进行排序
uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数
sort -k 1 -nr: -k 1按照第一个字段数值排序(因为前面用uniq -c进行了统计,所以每行的 第一个字段是统计的数值), -n 依照数值的大小排序 -r 倒叙排列
head -10: 取前10行数据

request_terminate_timeout

request_terminate_timeout:最大执行时间, 在php.ini中也可以进行配置(max_execution_time),这个是用来处理因为PHP执行时间超长而报502错误的解决。
max_execution_time=1,不一定1s后就会中止脚本,可能是2s、3s甚至更长的时间;而request_terminate_timeout=4则就会在4s后中止脚本的执行。所以在配置超时时间的时候,最好两个都配置,max_execution_time时间短一点,而request_terminate_timeout时间长一点

4. nginx.conf、php-fpm.conf和php.ini三者之中的error_log指令之间的区别和联系

1、当三个值同时配置时,php的错误日志会写入php.ini中error_log指定的文件,但如果这个error_log指定的文件没有可写权限时会怎样呢,会不会记录到nginx或者php-fpm的error_log文件中呢?答案是否定的,此时报错信息会因为无法写入而丢失。
2、不配置php.ini 中的error_log,同时配置 nginx.conf 和php-fpm.conf 中的error_log,此时错误日志会写入到nginx的error_log文件中
3、由于nginx的error_log不支持关闭,所以无法比较 nginx.conf 和 php-fpm.conf 中 error_log 的优先级,实际上 php-fpm.conf 中的error_log并不用来记录php的报错信息,而用来记录php-fpm进程本身的一些运行时信息。

4、虽然php-fpm.conf 中的error_log 不会记录php的报错信息,但是在php-fpm.conf 中可以用 php_value/php_flag 或 php_admin_value/php_admin_flag 配置来覆盖php.ini中的配置:
5、php-fpm进程状态监控
1、nginx配置:遇到 status 的请求,直接转发给php
location ~^/status$ {
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
2、fpm配置(一般也是在子配置文件www.conf下配置):pm.status_path = /status(/usr/local/php7/etc/php-fpm.d/www.conf下的注释去掉)
3、然后重启fpm和nginx,在浏览器里访问就能看到了:

默认以 text/plain 展示结果,可以传参数 ?json或者?html或者?xml 分别得到json等格式的结果;参数full可以查看每个子进程的明细,也可以用?html&full的方式组合使用
正常情况下
pool 进程池名称
process manager 进程管理方式
start time 进程什么时候启动的
start since 进程已经运行了多少秒
accepted conn 该池总共accept了多少连接
listen queue 等待accept的连接的数量,如果这个值不为0,但是数值没有大于listen queue len就可以暂时不管,如果大于listen queue len,那么要增加FPM的进程数量,要么调节listen queue len的长度
max listen queue fpm启动后,历史最高等待accept的连接的数量
listen queue len 配置的监听队列最大长度 受限于listen.backlog和系统cat /proc/sys/net/core/somaxconn,两者中取最小值
idle processes 闲置的进程数
active process 正在工作的进程数(加上限制的,就是总的子进程数)
total processes 总的子进程数量
max active processes fpm启动后,历史最多同时工作的进程数
max children reached 进程管理模式为 'dynamic’和 'ondemand’时,此数值是当子进程不够用时,master创建更多子进程的次数,达到进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。
slow requests 慢请求个数
full参数下
pid 子进程ID;
state 子进程状态(Idle, Running, …);
start time 子进程启动的时间;
start since 子进程启动后运行了多少秒;
requests 当前子进程一共处理了多少个请求;
request duration 请求耗费的纳秒数;
request method 请求方法 (GET, POST, …);
request URI 请求参数;
content length POST请求时,请求的内容长度;
user - the user (PHP_AUTH_USER) (or ‘-’ if not set);
script 请求的哪个php文件;
last request cpu 上次请求耗费的cpu资源
last request memory 上次请求耗费的内存峰值
如果进程是闲置状态,那这些信息记录的就是上次请求的相关数据,否则就是当前本次请求的相关数据。

你可能感兴趣的:(nginx,php)