我们专注服务于当下互联网基础设施建设与云计算、大数据时代的各种需求!

502的解决方法

现象:
经过对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. server {
  6.           listen 80;
  7.           server_name a.b.cd.com;
  8.           charset utf-8;
  9.           location / {
  10.                   index index.php index.htm;
  11.                   root /var/www;
  12.               }
  13.           location ~ \.php$ {
  14.               root /var/www;
  15.               sendfile on;
  16.                fastcgi_pass backend
  17.   ……
  18.             }
  19. }

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

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