本篇文章主要是翻译、摘要Jan的Fastcgi Performance,有兴趣的同学可以阅读原文。
在error.log看到“(mod_fastcgi.c.2866) backend is overloaded, we disable it for a 2 seconds and send the request to another backend instead: reconnects: 3 load: 4147 /tmp/php.socket”时,说明lighttpd+fastcgi的load较高了。
可按如下步骤优化:
1) 首先检查swap使用情况。如果使用了swap,一般说明php进程数偏多,适当减少php进程。调整max-procs和PHP_FCGI_CHILDREN的数值,根据公式num-procs = max-procs * ( 1 + PHP_FCGI_CHILDREN ),启动时php5进程大概占13M内存,如果num-procs超过200,高峰期php就会占去2G内存,不大合适
2) 安装PHP加速软件。有XCache, eAccelerator和Zend Optimizer。推荐公开源代码的XCache, eAccelerator
3) 调整Keep Alive参数。对于动态程序来说,Keep Alive的意义不大,可以关闭。
server.max-keep-alive-requests = 0
4) 优化程序代码。呵呵,一般也是最有效的;)
compare php4 with php5 using 'ls' and 'size':
[root@pure modules]# file *php*
libphp4.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped
libphp5.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped
[root@pure modules#] ls -l *php*
-rwxr-xr-x 1 root root 1688412 May 13 12:10 libphp4.so
-rwxr-xr-x 1 root root 5660224 May 13 12:10 libphp5.so
[root@pure modules#] size *php*
text data bss dec hex filename
1543136 135444 3692 1682272 19ab60 libphp4.so
5061110 577324 9328 5647762 562d92 libphp5.so
size of php5 module is three times bigger than php4's, taking different builtin modules into account, the difference also is too big ; So it's wise to use php4, not php5;)
经过血的教训,只要apache用worker模式,php的pconnect方法不会自动释放连接;测试过mysql,memcache的pconnect,操作系统是FreeBSD或Linux。pconnect看上去挺美,实际不美,请各位慎用pconnect
测试平台:Dell 1850,双Xeon 2.8G,2G RAM。FreeBSD 6.0 SMP+SCHED_ULE+PREEMPTION+IPI_PREEMPTION。
PHP 4.4.1+Apache 2.0.55(MPM Worker)+libphtreads+memcache php module。
memcached 是一个基于内存的server,这样可以排除读写硬盘的开销。
测试工具:
/usr/local/apache2/bin/ab -c 1500 -n 5000 http://localhost/test_memcache.php