php-fpm 优化

首先先理解一下 CGI 、FASTCGI 、PHP-FPM的概念

CGI 是用来接收HTTP请求的一个程序,例如[127.0.0.1/index.php?c=article&id=11,这个请求通过apahce、nginx等等过来,然后http服务器发送给php-cgi(就是php用来接收http的程序),这个玩意儿每次新建一个进程的时候都要读取和加载php.ini的一堆参数,然后才能开始接收请求,比较慢。

FASTCGI的工作原理是首先启动一个master,这个master加载了所有的配置信息等等,master会新建很多个worker,然后每次有请求的时候master负责把请求分配给相应的worker,这样避免了重复加载和启动,就是一个提交cgi程序效能的东西,fastcgi这个东西只是一个协议(你可以理解为是一个没实现的想法),并不是一个程序。

PHP-FPM就是实现这个想法的程序,CGI很蠢,不会管理进程,而PHP-FPM会根据实际情况,创建worker或者关掉worker进程,保持一定量的worker,请求多了,worker就多了,请求少了,worker就会被关掉一部分,你可以理解为它是一个高效CGI的进程管理器。

—————————————————————————————————————————————————————————————————————————————

修改 /usr/local/php/etc 目录下的php-fpm.conf文件

手动启动 php-fpm
[root@user]#/usr/local/php/sbin
[root@user]#./php-fpm

重启php-fpmm

[root@user]# ps -ef | grep php-fpm

[root@user]# killall php-fpm

[root@user]# cd /usr/local/php/sbin/php-fpm

1、php-fpm优化参数介绍
他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。

pm:表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。
在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。

———————————————————————————————————

pm = dynamic
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进程数

——————————————————————————————————————————————————————————————————————

php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout

像这种全php的网站,每个连接都需要apache+php-fpm协同运作。即便php-fpm中的request_terminate_timeout时间设置很长,apache中的timeout时间设置略短,只要apache的timeout到了,php-fpm照样在后面杀进程……

如果网站的访问者比较多,php-fpm的child是被许多访问者共用的,杀一个child,就有可能导致几个用户同时http 503 Service Unavailable。所以,我的建议是——php-fpm中的request_terminate_timeout最好不要设置,只给apache一个timeout就够了。

  • php-fpm设置request_terminate_timeout后,php.ini中的max_execution_time和max_input_time都会失效,以php-fpm中的设置为准;
  • apache+mod_php在timeout后,只会在日志中记录一下,仅此而已。php-fpm中的request_terminate_timeout超时之后,日志中记录http 503的同时,最要命的,它还会直接杀死造成这个http 503的php-fpm child,并生成新的child。

——————————————————————————————————————————————————————————————————————
我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。
计算的方式如下:
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没 有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有 时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那 么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越 高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉 而出现502 Bad gateway这个错误。
而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多 了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php- cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI 所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很 累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

————————————————————————————————————————————————————————————————————————————

引用:http://blog.sina.com.cn/s/blog_5459f60d01012sjf.html

2.unix domain socket(共享内存的方式)要比tcp网络端口配置性能要好

不考虑backlog,请求速度有量级的飞跃,但错误率超过50%

加上backlog,性能有10%左右提升

3.调整nginx、php-fpm和内核的backlog(积压),connect() to unix:/tmp/php-fpm.socket failed (11: Resource temporarily unavailable) while connecting to upstream错误的返回会减少

nginx:

配置文件的server块

listen 80 default backlog=1024;

php-fpm:

配置文件的

listen.backlog = 2048

kernel参数:

/etc/sysctl.conf,不能低于上面的配置

net.ipv4.tcp_max_syn_backlog = 4096

net.core.netdev_max_backlog = 4096

4.增加单台服务器上的php-fpm的master实例,会增加fpm的处理能力,也能减少报错返回的几率

多实例启动方法,使用多个配置文件:

/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf &

/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm1.conf &

nginx的fastcgi配置

    upstream phpbackend {

#      server   127.0.0.1:9000 weight=100 max_fails=10 fail_timeout=30;

#      server   127.0.0.1:9001 weight=100 max_fails=10 fail_timeout=30;

#      server   127.0.0.1:9002 weight=100 max_fails=10 fail_timeout=30;

#      server   127.0.0.1:9003 weight=100 max_fails=10 fail_timeout=30;

      server   unix:/var/www/php-fpm.sock weight=100 max_fails=10 fail_timeout=30;

      server   unix:/var/www/php-fpm1.sock weight=100 max_fails=10 fail_timeout=30;

      server   unix:/var/www/php-fpm2.sock weight=100 max_fails=10 fail_timeout=30;

      server   unix:/var/www/php-fpm3.sock weight=100 max_fails=10 fail_timeout=30;

#      server   unix:/var/www/php-fpm4.sock weight=100 max_fails=10 fail_timeout=30;

#      server   unix:/var/www/php-fpm5.sock weight=100 max_fails=10 fail_timeout=30;

#      server   unix:/var/www/php-fpm6.sock weight=100 max_fails=10 fail_timeout=30;

#      server   unix:/var/www/php-fpm7.sock weight=100 max_fails=10 fail_timeout=30;

    }

        location ~ \.php* {

            fastcgi_pass   phpbackend;

#           fastcgi_pass   unix:/var/www/php-fpm.sock;

            fastcgi_index index.php;

       ..........

       }

————————————————————————————————————————————————————————————————————————————

php-fpm.conf 示例文件

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = 2048
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 50
request_terminate_timeout = 900
request_slowlog_timeout = 100
slowlog = var/log/slow.log

本文地址:http://www.vnote.net/index.php?m=Home&c=Article&a=index&id=55


回复列表



回复操作

正在加载验证码......

请先拖动验证码到相应位置

发布时间:2016-08-27 10:28:49

修改时间:2017-01-13 16:35:08

查看次数:317

评论次数:0