PHP网页编程之代码从业者的一次php使用优化理论
接触MYSQL,开始设计数据库程序 体系跑得工夫长了,总会呈现如许那样的成绩和瓶颈,有了成绩不成怕,咱们有“打虎”的家伙事儿--不过就是定位成绩->剖析成绩->提出处理计划->理论->了局反应->总结再优化。之前做过的一次优化理论,比来翻出来看看,有些通用的优化手腕仍是可以复用的。体系跑得工夫长了,总会呈现如许那样的成绩和瓶颈,有了成绩不成怕,咱们有“打虎”的家伙事儿--不过就是定位成绩->剖析成绩->提出处理计划->理论->了局反应->总结再优化。
成绩描写:体系采取 PHP5 + Zend framework 开辟,在数据范围和会见量增添后(万万级),呈现了后台apache办事器负载太高的景象,在会见岑岭时段(好比天天上班到早晨10点这一段工夫,出格是周五),机械CPU负载会飙升到170多,CPU负载太高形成处置恳求也响应的变慢,所以亟需处理这个成绩。
成绩剖析:经由过程一连几天的察看和剖析,当CPU利用率到达100%时,个中体系CPU利用率占有了很大的比例,用户CPU利用率倒不是很高,别的前端 haproxy 和 squid cache的cpu负载很低,memcached和squid的hit ratio普通都能到达60%摆布。
剖析backend的access-log,发明相当大一局部恳求的User-Agent是搜刮爬虫;
同时,在 apache 上设置装备摆设了xdebug,在余暇时段对次要的页面的丈量了一组功能数据,经由过程利用kcachegrind对测得的数据停止剖析(若何设置装备摆设xdebug,可以用soso搜一下),发明:
功能数据不敷不乱,一样的恳求之间测试数据会相差对照大
慢的点对照分离
memcached的会见大局部的情形都对照慢(100ms以上)
处理计划经由过程上述初步的剖析,对现有的法式慢慢作了一系列调剂。
起首思索到的是是不是可以想举措增添前端squid cache的Hit ratio,从而削减穿透squid抵达后端apache的恳求数。
思索到相当一局部恳求来历于Crawler,而之前squid cache只会对设置了language cookie的恳求作cache,而来自Crawler的恳求都没有cookie信息。因而想到把来自Crawler的恳求都默许为language为zh_CN的,然后修正haproxy的设置装备摆设,把User-Agent为罕见的Crawler的恳求都转交给squid cache.
修正php代码,把一些页面的缓存工夫设置得更长一些
经由如上两个步调,抵达apache的恳求的确削减了一些,然而这个对cpu负载太高的成绩匡助很少,因而另寻它法。
其次,依据利用 xdebug profiling的了局来看,和memcached的交互耗时对照长,因而想是不是可以想举措让memcached能更快地呼应恳求,从而使得每次恳求能更快完成,从而使并发下降。
经由过程代码剖析,发明线上memcached利用的是poll(),而memcached的毗连数在忙碌的时分坚持在1000摆布,memcached的CPU利用率在 30% 摆布。很明显,poll()体例在处置如斯多的并发毗连时是很低效的。因而从头编译memcached,使其利用epoll()的体例来处置恳求,交换为epoll以后,memcached的cpu usage从 30%摆布下降到 3% 摆布,10倍之多!
别的,memcached的hit ratio不是出格高,并且被换出的item数也对照高,因而想到对cache的内容作partition.本来盘算做 manually partition,后来发明php的最新的memcache扩大就可以撑持依据cache的key主动作partition,并且能在不修正法式代码(需求修正设置装备摆设文件:-))的情形下增添新的memcached实例。因而晋级每个apache的php memcache扩大,然后再设置装备摆设文件中增添了一台新的memcached。到此完成memcached的内容partition。修正以后的后果对照明显,页面的载入工夫比修正前延长了良多。
经由这两步的调剂,memcached的效力比之前高了,然而apache的负载依然居高不下,没辙,再想其它举措!
进一步深切剖析后面说到次要体系CPU占用很高,要找缘由只能深切内核了:) 从如今入手下手了咱们的strace之旅。套用一句Nike的告白词:Just strace it!
在岑岭时段对 httpd 历程停止了strace,办法不过乎以下这些
strace -p PID -c 得出 summary
strace -p PID -o output.log 写入文件,渐渐研讨
strace -p PID -e trace=file 只看 filesystem 操作相干的 syscalls
strace -p PID -elstat64,stat64,open,getcwd 只跟踪这些 syscalls
…
从上述strace剖析失掉以下结论:
lstat64,stat64,open等 syscalls其实是多啊
上述 syscalls 占用工夫的确很多! 60%以上的工夫都被它们抢了, orz
绝大多半 syscall 是掉败的,真是屡败屡战啊
有了上述数据,咱们就找到了成绩的偏向了,那就是找这些毫有意义的体系挪用是怎样来的。
经由剖析,这些是php要加载某一个类时,会去 include_path 中界说的一系列目次中搜索该类对应的文件,挨个目次这么试曩昔,直到找到为止。嗯,这类体例明显是对照低效的,有无更好的体例来完成这个工作呢?谜底是一定的,有!并且还有不止一种办法!
挪用require_once()时,参数写相对途径(入手下手Guys write Zend Framework就不懂这个事理;后来才有更新))
利用 __autoload()对class停止 lazy loading,也就是说真正需求的时分才去加载,而不是不论三七二十一把能够用到的类文件都require_once了。
成绩是找到了,然而要处理这个成绩还面对着另外一个成绩。开辟中代码都注重用相对途径了,独一可以改善的中央是改成 lazy loading,然而 Zend Framework中大批的require_once采取绝对途径,这个就是招致成绩——这里我说的成绩是本文咱们议论的CPU负载太高的成绩——的基本缘由。
OK,既然成绩找到了,下手处理。写个剧本主动生成 Class -> File Path 对应关系,生成代码中一切类和Zend Framework中一切类的对应关系文件。把代码中和Zend Framework库中一切的 require_once 都正文失落。然落后行具体的测试,然后上线。了局使人受惊,负载降到了 3 之内!!成绩处理。
总结:
写代码的人都晓得,能够出成绩的中央总会出成绩,任何成绩城市有个缘由(哪怕临时没有找到),从根上处理才是霸道,处理甚么成绩不主要,但愿人人能进修这个处理的思绪,擅长使用东西。ok,这个case就如许了。
<P style="TEXT-INDENT: 2em">
掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。 php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 Ps:以上纯属原创,如有雷同,纯属巧合 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
页:
[1]
2