设为首页 收藏本站
查看: 445|回复: 0

[经验分享] apache/php 性能大幅提升关键参数

[复制链接]

尚未签到

发表于 2017-1-5 07:42:23 | 显示全部楼层 |阅读模式
  最近要对公司的网站做测试,我主要使用LoadRunner和ApacheBench高低搭配进行测试。LoadRunner主要用来压力测试,可以模拟用户行为,实时监测,有均值,曲线图,结果比较直观。ApacheBench也不差,比较简单,可以用来测试性能。本文侧重测试Apache/php性能,所以以ApacheBench说明。
  测试过程发现一个问题,百思不得其解。
  使用ApacheBench测试一段时间后,经常报这个错误“apr_poll: The timeout specified has expired (70007)”,引起了我的强烈关注

apache/php 问题测试过程
  测试机器

硬件 CPU G620 2.60GHz(双核)RAM 4.00GB(2.99GB可用)

软件 win7 32位 旗舰版Apache/2.2.19PHP/5.3.26
测试命令

ab -n 10000 -c 100 http://localhost/
测试结果

静态页面(index.html)的测试性能 1200 - 1300 rps

PHP空白页(只有echo 1;)测试效果不稳定,波动很大,100 - 600 rps,越测试性能越低。测试经常都是到了95%~99%的时候ApacheBench就停住,然后报错,或者很久才响应,测试结果只有100多


PHP页面测试过程可能引发的ApacheBench错误:

apr_poll: The timeout specified has expired (70007)

Total of 9987 requests completed


这个错误出现的原因通过各种排查,最终做了定位。当php使用session.auto_start,测试一段时间后几乎都会遇到这个问题,相反,取消php的session.auto_start,问题没有发生。
apache/php 提升性能关键参数

参数1:Apache KeepAlive

Apache KeepAlive需要和线程绑定,服务器繁忙时会耗光所有线程
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)

Total of 195 requests completed

参数3:PHP Session
session.auto_start = 0
  代价很小,每次使用session都要显式的session_start(),这也是个好习惯

apache/php 性能提升效果

修改了上面3个参数,再来看下测试结果:
  静态页面的测试性能 1500 - 1700 rps
  php空白页的测试性能 1100 - 1200 rps
  或者上面的结果还不够振奋人心,文章测试数据是以我普通电脑来测试的,换成服务器结果会怎样?
  戴尔PowerEdge R610(Xeon E5606*2/16GB)服务器搭载windows server 2008系统,测试php空白页rps达到2.2k以上。2.2k这个处理能力已经很可观了,再上去就是Apache没有真正使用iocp的问题了

php/session 进一步讨论
  聪明的你肯定会有疑问,如果页面显式的调用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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323947-1-1.html 上篇帖子: 增大apache 2的最大连接数 下篇帖子: Apache的多种缓存设置方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表