多个php-fpm实例,告别nginx+PHP的502错误

1252阅读 0评论2012-11-01 initrdimg
分类:

现象:
     经过对php-fpm进程数的调整,从4一直到200,对于claroline来说,最优的结果是CPU数x2,多了或少了,都影响性能。
     在用ab进行测试的时候,不论哪种情况,只要超过cpux2的时候,top中都会出现大量的lockf,性能便会下降。
     但是无论怎么调整php-fpm和nginx的参数,并发超过200的时候,ab就会报length错误,并且是大量的错误。同时在nginx-error.log中,出现大量的“Connection reset by peer”(如果是socket的话,会出现“unix:/tmp/php.socket failed (61: Connection refused)”)。
     并发数不超过200没有错误,250并发的时候,>64个php-fpm进程没错误;300并发需要128以上的进程数,并且每秒的页面数只能是最大值的1/4-1/5左右。
     四核机器,php进程为8的时候,没有错误,也没有lockf,index的数目大约是220,为12的时候就成为170,16就成了120,48大约70,64大约50,128以上大约35。
     网上说的方法,基本上都用遍了,仍然不能解决。

原因(只是自已猜测,没查到权威的解释):
    nginx发起的连接数,远远超过了php-fpm所能处理的数目,导致端口(或socket)频繁被锁,造成堵塞。

解决思路:

 把php-fpm分为两部分,每部分各听一个端口或socket,这样就减少了lock
 
方案:
1、fpm2的调整(FreeBSD下)
  (1)复制php-fpm.conf为php-fpm2.conf,并修改占用的端口(socket)
  (2)复制rc.d/php-fpm为rc.d/php-fpm2,进行修改,把所有的fpm都替换为fpm2,并添加:
  
  1. start_precmd="${name}_prestart"

  2. php_fpm2_prestart()
  3. {
  4.         rc_flags="-y /usr/local/etc/php-fpm2.conf"
  5. }

2、nginx的调整:

  1. upstream backend{
  2.    server 127.0.0.1:9000;
  3.    server 127.0.0.1:9002;
  4.   }
  5.   
  6.   
  7. server {
  8.           listen 80;
  9.           server_name a.b.cd.com;
  10.           charset utf-8;
  11.   
  12.           location / {
  13.                   index index.php index.htm;
  14.                   root /var/www;
  15.               }
  16.   
  17.           location ~ \.php$ {
  18.               root /var/www;
  19.               sendfile on;
  20.                fastcgi_pass backend
  21.   ……
  22.             }
  23. }

3、用socket的优化:
   用md系统,要比普通文件系统快很多。

善后?
  Session会不会遇到麻烦?


上一篇:安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH)
下一篇:Linux权限360度赤裸裸华丽丽大曝光连载之一:从ls开始