现象:
经过对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,并添加:
- start_precmd=”${name}_prestart”
- php_fpm2_prestart()
- {
- rc_flags=”-y /usr/local/etc/php-fpm2.conf”
- }
2、nginx的调整:
- upstream backend{
- server 127.0.0.1:9000;
- server 127.0.0.1:9002;
- }
- server {
- listen 80;
- server_name a.b.cd.com;
- charset utf-8;
- location / {
- index index.php index.htm;
- root /var/www;
- }
- location ~ \.php$ {
- root /var/www;
- sendfile on;
- fastcgi_pass backend
- ……
- }
- }
3、用socket的优化:
用md系统,要比普通文件系统快很多。
善后?:
Session会不会遇到麻烦?