用户
 找回密码
 入住 CI 中国社区
搜索
查看: 12775|回复: 25
收起左侧

[讨论/交流] 压力测试结果:CI还是很脆弱,HELP

  [复制链接]
发表于 2012-3-3 11:23:55 | 显示全部楼层 |阅读模式
本帖最后由 xnettunnel 于 2012-3-3 13:30 编辑

因为准备接一个预期有大量并发访问的项目,注意,是并发,不是同时在线。原先的JAVA平台放弃(谁都知道JAVA脆弱),转投PHP,对比了各类框架,看上了CI,因为易上手^_^。
刚写了个工具用于压力测试,有需要的同学可以站内短信我。
首先测试原生的php,有访问数据库:
1、并发300个线程,每个线程持续发送请求20次,结果是:再测试过程中,apache服务CPU资源蛮高的,但另开浏览器,可以正常访问这个原生php的URL,也可以访问CI框架写的的URL。
2、并发500个线程,每个线程持续发送请求20次,结果:30秒后,在浏览器上访问这个原生PHP,浏览器在等待,访问CI框架写的URL,也在等待,等测试完结后,这两个URL均能正常访问。

再测试CI框架的URL,也有访问数据库的:
1、并发300个线程,每个线程持续发送请求20次,结果:30秒后,报Mysql太多连接,连接错误了,然后,不久就php内存过大,不能访问。必须重启PHP和Mysql。

我认为,是不是CI有用了连接池或持久连接的技术才会这样。有什么方法可以优化CI的并发性能?
======
附上测试工具,以前一个项目要测试压力时写的,刚用D2010重新编译了下,估计360或一些工具会警告?
其实也可以在控制台用apache的ab工具,今天才知道,土著啊。。。

webtest.rar (469.79 KB, 下载次数: 113)
发表于 2012-3-3 11:48:35 | 显示全部楼层
程序的优化有限,可以考虑服务器的优化。
nginx,load balance,varnish cache
发表于 2012-3-3 12:38:16 | 显示全部楼层
CI中应该没有使用连接池,因为我没有看到关于池的配置信息。
如果讲求效率的话,java的效率是高于php的。至于你说的“脆弱”是什么意思我就不懂了。
在者,你刚才测试原生的php的时候,没有使用数据库;但是测试CI的时候使用了数据库,我想你测试CI的时候,瓶颈在于数据库,你的数据库连接数要小于你测试用的线程数,造成了数据库端的堵塞,从而造成php端数据库操作所占有的内存空间一直得不到释放,而apache端由于php的处理未完成,所以线程一直处于等待状态,最终造成的结果是mysql、php、apache都不能用了。
只是个人推测。这种高压情况下用java是更合适些的;如果用php的话,要在服务器端做一些优化配置,要么加大服务器端所能容纳的连接数目,要么采用缓存技术,减小客户端的请求次数。
发表于 2012-3-3 12:40:15 | 显示全部楼层
求压力测试工具
 楼主| 发表于 2012-3-3 13:07:13 | 显示全部楼层
yunnysunny 发表于 2012-3-3 12:38
CI中应该没有使用连接池,因为我没有看到关于池的配置信息。
如果讲求效率的话,java的效率是高于php的。至 ...

首先,要测试的原生PHP和CI框架的PHP都是要访问数据库的。
撇开框架,纯java和纯php对比,java无论是效率还是性能是远不如php的,asp.net更不是同一级别,不行可以用压力测试工具试下。

CI没有连接池的概念,估计是因为用了pconnect的持久连接?因为原生php的连接没有用这个,一会我改写CI的设置再试试。
发表于 2012-3-3 13:11:11 | 显示全部楼层
loadrunner 、Web-Application-Stress-Tool
发表于 2012-3-3 13:12:51 | 显示全部楼层
xnettunnel 发表于 2012-3-3 13:07
首先,要测试的原生PHP和CI框架的PHP都是要访问数据库的。
撇开框架,纯java和纯php对比,java无论是效率 ...

为啥说java的性能不如php呢,java是先编译后解释类型的语言,php是脚本语言,你这么下定义是解释不通的。
发表于 2012-3-3 13:19:14 | 显示全部楼层
并发300个线程,用java的话,是很easy的事情,不会出现你说的服务器堵塞的情况。我这双核的台式机,跑1000个线程,其间有数据库操作、非对称加密(rsa)运算,都是没有问题的。
 楼主| 发表于 2012-3-3 13:24:07 | 显示全部楼层
结果来了
把database.php里面的pconnnect设为FALSE,db_debug设为FALSE,300个并发链接,三十秒后,浏览器上依然可以访问,不过很慢。等测试结束后,浏览器上的访问完全正常。

再问个傻点的问题:pconnect估计就是可以代替连接池的作用了,持久连接,据说是借用了apache的进程池。那php有没有一个机制设置最大的连接数,如果超过的时候,让请求方等待的机制或实现方法,类似java的连接池那样??
发表于 2012-3-3 13:33:13 | 显示全部楼层
xnettunnel 发表于 2012-3-3 13:24
结果来了
把database.php里面的pconnnect设为FALSE,db_debug设为FALSE,300个并发链接,三十秒后,浏 ...

学习了。

本版积分规则