最近要对公司的网站做测试,我主要使用LoadRunner和ApacheBench高低搭配进行测试。LoadRunner主要用来压力测试,可以模拟用户行为,实时监测,有均,曲线图,结果比较直观。ApacheBench也不差,比较简单,可以用来测试性能。本文侧重测试Apache/php性能,所
最近要对公司的网站做测试,我主要使用LoadRunner和ApacheBench高低搭配进行测试。LoadRunner主要用来压力测试,可以模拟用户行为,实时监测,有均值,曲线图,结果比较直观。ApacheBench也不差,比较简单,可以用来测试性能。本文侧重测试Apache/php性能,所以以ApacheBench说明。
测试过程发现一个问题,百思不得其解。
使用ApacheBench测试一段时间后,经常报这个错误“apr_poll: The timeout specified has expired (70007)”,引起了我的强烈关注
测试机器
硬件 CPU G620 2.60GHz(双核)RAM 4.00GB(2.99GB可用)KeepAlive Off
参数2:Apache MPM
Apache MPM可以通过优化apache内部进程的调度来提高apache的处理能力,这里为windows参数(其他系统没测试,不提供参考,具体看官方文档)
<ifmodule mpm_winnt.c> #Win32DisableAcceptEx ThreadsPerChild 1000 MaxRequestsPerChild 10000 </ifmodule>
参数Win32DisableAcceptEx会降低性能,但如果服务器网络不稳定,Apache经常报这个错误“[warn] (OS 64)指定的网络名不再可用。 winnt_accept: Asynchronous AcceptEx failed.”,就得考虑使用
参数Win32DisableAcceptEx的使用也是有风险的,可能带来另外一个问题。ApacheBench测试时,容易出现以下错误:
apr_socket_recv: 远程主机强迫关闭了一个现有的连接。 (730054)session.auto_start = 0
代价很小,每次使用session都要显式的session_start(),这也是个好习惯
静态页面的测试性能 1500 - 1700 rps
php空白页的测试性能 1100 - 1200 rps
或者上面的结果还不够振奋人心,文章测试数据是以我普通电脑来测试的,换成服务器结果会怎样?
戴尔PowerEdge R610(Xeon E5606*2/16GB)服务器搭载windows server 2008系统,测试php空白页rps达到2.2k以上。2.2k这个处理能力已经很可观了,再上去就是Apache没有真正使用iocp的问题了
聪明的你肯定会有疑问,如果页面显式的调用session_start(),比起php的session.auto_start,性能又有什么区别?
我也做了测试,答案是一样的,也就是说session的使用消耗很大的性能那么为什么会这样,session的使用消耗很大的性能?
和session.save_handler保存session方式有关吗?难道是操作系统io瓶颈?
下面又做一些测试来研究这个问题。
session.save_handler有几种保存方式:files,memcache,mysql等
mysql保存方式无异于files,或者说效率也不会高于files,因为高并发时,update太频繁,问题太多
memcache是保存到内存中,读写相对系统文件io来说都是比较高效的,缺点是数据不能持久化所以这里测试memcache保存session效率,对比一下默认的files方式?
修改php配置文件
session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" session.auto_start = 1
php空白页测试性能稳定在 500 - 750 rps,ApacheBench没有出现错误
再回到files方式,难道和session存放路径有关?
修改php配置文件session.save_handler = files session.save_path = "d:/sess_tmp/" session.auto_start = 1测试结果和最开始的结果差不多,同样会引发Apachebench错误
这一次测试发现的主要问题是系统文件io瓶颈问题。相对于内存io来说,文件io是低速的,而且容易出错。这里有以下几个结论:
1、能够不用到文件读写尽量不用,考虑使用memcache等内存数据库。
2、尽量避免在一个大访问量页面做一些文件操作,如MySQL Select/Update等等。
3、对于访问较大的页面可以考虑写成静态html文件,以js方式动态更新。因为javascript脚本是等到页面加载完成后才开始执行的,也就是说,这种方式从某种程度上提高了服务端抵御ddos攻击的能力。
继续阅读
windows服务器应对高并发和DDOS攻击
简单实现web服务器负载均衡
网站安全:apache/php安全配置
apache模块 提高网页加载速度
windows下编译php扩展 memcache