测试目的:隐藏
测试目标:只用数据说话,不做评论
测试平台:垃圾服务器,能更好的看出负载
IIS6.0 win2003 E5300 4G
服务端统一为,就输出个时间.
<?=time();?> 或者 <%Response.write(now())%>
A. IIS+ISAPI
IIS+PHP5.1.2 fastCGI 工作进程MAX=30 队列2000
结果:一分钟执行5400次
B. IIS+FastCGI
结果:一分钟执行4000次 有卡顿..和500错误.不知道为什么.
修正:我之前配置不当,造成阻塞了...
现在测试为10000次...确实和ASPX单页面执行效率一模一样,稍微有1%的额外开销.
C.IIS+ASPX
一分钟执行:9600次
D.upupw( nginx + PHP-cgi) 压力测试通不过 4800左右伴随500错误
修正:默认的fastCGI设置存在性能问题,暴力请求会造成500错误
E.UniServer Zero XI (Apache+PHP)稳定...9800次..出乎意料呢
不知道咋回事只要php跑在CGI模式下,压力一上去就有500错误,调了fastcgi_ext.ini也没用..怪...
不过目前看出一个问题,就是只要是windows,极限顶天也就10000次每分钟..(E5300垃圾CPU)
[Types]
php=PHP
htm:1916250451=PHP //让IIS里面的某一个网站(网站数字ID见IIS)控制让html也作为php发送给cgi来解析
html:1916250451=PHP
[PHP]
ExePath=C:\PHP\php-cgi.exe
MaxInstances=300
InstanceMaxRequests=20000
queueLength=2000
IdleTimeout=300 //当没有任何连接请求,多久时间关闭进程(单位:秒)
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:20000,PHPRC:C:\PHP\
;ActivityTimeout=600
;RequestTimeout=600
;红色字体部分数字要统一
;关于queueLegth,这个是是指master进程的队列长度,根据网站访问量应该合理调整.也是主要调整参数.调低了,比如10个,你一直按着F5刷新,很快就会提示你500错误即不再接收新连接,因为队列满了,前面的10个还没处理完,直接就抛出客户端500提示了,丢弃了.队列处理完再接收新的链接请求.所以如果这个时候你看下服务器的CPU,没有超过87%的时候,可以调高哈,当然这个是受到整个后台系统的影响的.在一条完成的后台服务体系中,最薄弱的环节是可以测试出来的,慢慢增加queueLength,从100开始,间隔200一加,慢慢增加,当F5一直按着,CPU不再升高,然后一放开,很快就页面就显示出来了,说明队列处理完了.放开F5到页面显示出来,这中间的这个时间差,如果你觉得达到理想状态了,那么这个时候的queueLength就是最佳值. queueLength太低,会造成CPU还没有满负荷但是频繁出现500错误,拒绝再接收新连接;如果值太高,那么会一直阻塞很久,页面才显示出来...最长时间是PHP.ini设置的超时时间(默认30秒)...所以怎么均衡这个用户体验时间,就是个技巧了,和技术无关.大家自己试试吧.
另外解释下啊,最大请求20000次是指单进程到2W次就重启进程一下.会占用开销.但是不大.
但是因为cgi独特的异步响应机制所以可以由master进程并发下发子请求给slave进程,所以这种异步模型可以并行处理很多请求....适用于高负荷网站...如果考虑到被黑客DDOS了,那么也可以用fastCGI临时顶一下...那么如果是我被攻击了,我是不会这么做的,因为IIS上几千/秒 的极限负载对于DDOS来说本来就意义不大. 正确的做法是遇到DDOS就上(硬防+fastCGI)或者封IP(需要辅助程序来识别并自动封,手动封那么多IP,不现实)
普通的小型网站,PV5W以下都建议采用ISAPI方式,可靠,稳定,没有性能问题.
高负荷网站,绝对要用fastCGI模型.以便通过异步进程通信模型,充分利用多核心CPU来异步处理更多的请求.这是用好多核CPU的手法.
最终我的配置,感觉平衡的还不错~~~
[Types]
php=PHP
htm:1916250451=PHP
html:1916250451=PHP
[PHP]
ExePath=C:\PHP\php-cgi.exe
MaxInstances=8
InstanceMaxRequests=20000
queueLength=2000
IdleTimeout=300
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:20000,PHPRC:C:\PHP\
ActivityTimeout=300
RequestTimeout=300
当然生产服务器是E5 2630v2双路 24核心 所以上面我调的8进程2W请求这么个等级 爽飞! 极限请求次数没测过,反正目前完全没问题,可抗住DDOS...嘎嘎...
- InstanceMaxRequests 用来设置应用程序池回收。FastCGI进程请求数达到InstanceMaxRequests数值20000,应用程序池将自动回收。默认值是1000。
- 当环境变量PHP_FCGI_MAX_REQUESTS达到20000将自动回收应用程序池。
- RequestTimeout 设置请求超时时间,也就是请求允许的最大时间,如果FastCGI进程请求超过此设置将被禁止,值是90秒。
- ActivityTimeout 指定FastCGI进程请求的最大活跃时间,在设定时间内,FastCGI进程和IIS没有通信,将终止进程。默认值是70秒。
用windows主要是方便,安全性也可以做的不错
用linux是强悍,但是不太方便啊,权衡了下.别人下班了,你可能还在搞vi..算了,装windows...哈哈
-----------------------------第二天的分割线-----------------------------
今天想骂人,因为刚才才发现昨天测试的数据都不准确.
忽略了网卡流量已经满载了.
因为我用的是wifi,2.4g150M的极限速度也就是4MB/S左右...完全不够测试流量啊.!!!!
今天重新测试:
Kangle+FastCGI 实测1800次/10秒 还是基于IOCP模型的...无语了
IIS+FastCGI 请求 3700次/10秒
IIS+ASPX 3800次/10秒
UniServer Zero XI (Apache+PHP)稳定...3800次/10秒
IIS+PHP(ISAPI) 2000次/10秒
IIS+一个txt文件 3800次/10秒(说明是E8200这种CPU+ICH7南桥芯片组的极限吧)
至此,尘埃落定....nginx没测,实际上都是fastCGI模型架构,标准异步socket模型,性能应该和UniServer Zero XI差不多,,(高一点点吧,算4000咯,哈哈)