搜索
您的当前位置:首页正文

PHP-FPM进程数的设定

来源:知库网
PHP-FPM进程数的设定

近⽇,服务器出现异常,⽹站不能正常访问。经排查是php的问题。

在重启php-fpm时,恢复正常。1分钟之后⼜出现故障。查看php⽇志⽂件 /usr/local/php/var/log 后提⽰

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

⼦进程数已经达到设置的最⼤值。

要设置php进程数量。需要在php-fpm.conf⽂件中修改。先看/usr/local/php/etc/php-fpm.conf⽂件各项配置解析

pid = run/php-fpm.pid

#pid设置,默认在安装⽬录中的var/run/php-fpm.pid,建议开启

error_log = log/php-fpm.log

#错误⽇志,默认在安装⽬录中的var/log/php-fpm.log

log_level = notice

#错误级别. 可⽤级别为: alert(必须⽴即处理), error(错误情况), warning(警告情况), notice(⼀般重要信息), debug(调试信息). 默认: notice.

emergency_restart_threshold = 60emergency_restart_interval = 60s

#表⽰在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项⼀般保持默认值。

process_control_timeout = 0

#设置⼦进程接受主进程复⽤信号的超时时间. 可⽤单位: s(秒), m(分), h(⼩时), 或者 d(天) 默认单位: s(秒). 默认值: 0.

daemonize = yes

#后台执⾏fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使⽤不同的设置来运⾏多个进程池。 这些设置可以针对每个进程池单独设置。

listen = 127.0.0.1:9000

#fpm监听端⼝,即nginx中php处理的地址,⼀般默认值即可。可⽤格式为: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置.

listen.backlog = -1

#backlog数,-1表⽰⽆限制,由操作系统决定,此⾏注释掉就⾏。backlog含义参考:

http://www.3gyou.cc/?p=41

listen.allowed_clients = 127.0.0.1

#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是⽤逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接

listen.owner = wwwlisten.group = wwwlisten.mode = 0666

#unix socket设置选项,如果使⽤tcp⽅式访问,这⾥注释即可。

user = wwwgroup = www

#启动进程的帐户和组

pm = dynamic #对于专⽤服务器,pm可以设置为static。

#如何控制⼦进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的⼦进程数。如果选择dynamic,则由下开参数决定:pm.max_children #,⼦进程最⼤数pm.start_servers #,启动时的进程数

pm.min_spare_servers #,保证空闲进程数最⼩值,如果空闲进程⼩于此值,则创建新的⼦进程pm.max_spare_servers #,保证空闲进程数最⼤值,如果空闲进程⼤于此值,此进⾏清理

pm.max_requests = 1000

#设置每个⼦进程重⽣之前服务的请求数. 对于可能存在内存泄漏的第三⽅模块来说是⾮常有⽤的. 如果设置为 ’0′ 则⼀直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

pm.status_path = /status

#FPM状态页⾯的⽹址. 如果没有设置, 则⽆法访问状态页⾯. 默认值: none. munin监控会使⽤到

ping.path = /ping

#FPM监控页⾯的ping⽹址. 如果没有设置, 则⽆法访问ping页⾯. 该页⾯⽤于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。

ping.response = pong

#⽤于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式⽂本. 默认值: pong.

request_terminate_timeout = 0

#设置单个请求的超时中⽌时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中⽌运⾏的脚本有⽤. 设置为 ’0′ 表⽰ ‘Off’.当经常出现502错误时可以尝试更改此选项。

request_slowlog_timeout = 10s

#当⼀个请求该设置的超时时间后,就会将对应的PHP调⽤堆栈信息完整写⼊到慢⽇志中. 设置为 ’0′ 表⽰ ‘Off’

slowlog = log/$pool.log.slow

#慢请求的记录⽇志,配合request_slowlog_timeout使⽤

rlimit_files = 1024

#设置⽂件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使⽤ ulimit -n查看,ulimit -n 2048修改。

rlimit_core = 0

#设置核⼼rlimit最⼤限制值. 可⽤值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值.

chroot =

#启动时的Chroot⽬录. 所定义的⽬录需要是绝对路径. 如果没有设置, 则chroot不被使⽤.

chdir =

#设置启动⽬录,启动时会⾃动Chdir到该⽬录. 所定义的⽬录需要是绝对路径. 默认值: 当前⽬录,或者/⽬录(chroot时)

catch_workers_output = yes

#重定向运⾏过程中的stdout和stderr到主要的错误⽇志⽂件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.

根据以上配置的解析,在php-fpm.conf⽂件中添加如下配置:pm.max_children = 100pm.start_servers = 30pm.min_spare_servers = 20pm.max_spare_servers = 100pm.max_requests = 500

以观后效。

另附⾖瓣技术贴:https://www.douban.com/note/315222037/

1、php-fpm优化参数介绍

他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。pm:表⽰使⽤那种⽅式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更⽼⼀些的版本中,dynamic被称作apache-like。这个要注意看配置⽂件的说明。

下⾯4个参数的意思分别为:

pm.max_children:静态⽅式下开启的php-fpm进程数量pm.start_servers:动态⽅式下的起始php-fpm进程数量pm.min_spare_servers:动态⽅式下的最⼩php-fpm进程数pm.max_spare_servers:动态⽅式下的最⼤php-fpm进程数量区别:

如果dm设置为 static,那么其实只有pm.max_children这个参数⽣效。系统会开启设置数量的php-fpm进程。如果dm设置为 dynamic,那么pm.max_children参数失效,后⾯3个参数⽣效。系统会在php-fpm运⾏开始 的时候启动pm.start_servers个php-fpm进程,

然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数

2、服务器具体配置

对于我们的服务器,选择哪种执⾏⽅式⽐较好呢?事实上,跟Apache⼀样,运⾏的PHP程序在执⾏完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候⼀个php-fpm进程只占⽤3M左右内存,运⾏⼀段时间后就会上升到20-30M的原因了。

对于内存⼤的服务器(⽐如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进⾏额外的进程数⽬控制,会提⾼效率。因为频繁开关php-fpm进程也会有时滞,所以内存够⼤的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,⽐如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样⼦。如果内存稍微⼩点,⽐如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够⽤的内存,将不多的内存分配给其他应⽤去使⽤,会使系统的运⾏更加畅通。

对于⼩内存的服务器来说,⽐如256M内存的VPS,即使按照⼀个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。因此应该尽量地控制php-fpm进程的数量,⼤体明确其他应⽤占⽤的内存后,给它指定⼀个静态的⼩数量,会让系统更加平稳⼀些。或者使⽤动态⽅式,因为动态⽅式会结束掉多余的进程,可以回收释放⼀些内存,所以推荐在内存较少的服务器或VPS上使⽤。具体最⼤数量根据 内存/20M 得到。

⽐如说512M的VPS,建议pm.max_spare_servers设置为20。⾄于pm.min_spare_servers,则建议根据服务器的负载情况来设置,⽐如服务器上只是部署php环境的话,⽐较合适的值在5~10之间。本服务器配置

1、服务器基本信息:

硬盘:数据盘30G、系统盘20G内存:1.5GCPU:双核

系统:CentOS 6.3 64位带宽:独享2M2、部署的应⽤

Git、SVN、Apache、Tomcat、PHP、Nginx、Mysql、JDK3、优化后的参数pm = dynamic

pm.start_servers = 5

pm.min_spare_servers = 2pm.max_spare_servers = 8

pm.max_requests = 500

设置每个⼦进程重⽣之前服务的请求数. 对于可能存在内存泄漏的第三⽅模块来说是⾮常有⽤的. 如果设置为 ’0′ 则⼀直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

这段配置的意思是,当⼀个 PHP-CGI 进程处理的请求数累积到 500 个后,⾃动重启该进程。但是为什么要重启进程呢?

⼀般在项⽬中,我们多多少少都会⽤到⼀些 PHP 的第三⽅库,这些第三⽅库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使⽤量不断增长。因此PHP-FPM 作为 PHP-CGI 的管理器,提供了这么⼀项监控功能,对请求达到指定次数的 PHP-CGI 进程进⾏重启,保证内存使⽤量不增长。

正是因为这个机制,在⾼并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我⽬前⽤的还是 PHP 5.3.2,不知道在 PHP5.3.3 中是否还存在这个问题。

⽬前我们的解决⽅法是,把这个值尽量设置⼤些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提⾼总体性能。在我们⾃⼰实际的⽣产环境中发现,内存泄漏并不明显,因此我们将这个值设置得⾮常⼤(204800)。⼤家要根据⾃⼰的实际情况设置这个值,不能盲⽬地加⼤。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top