当前位置: 首页 > 科技观察

让你的PHP7更快(GCCPGO)

时间:2023-03-19 17:39:07 科技观察

我们一直致力于提高PHP7的性能。上个月我们注意到GCC的PGO可以在Wordpress上带来近10%的性能提升。这让我们非常兴奋。不过PGO,顾名思义(ProfileGuidedOptimization有兴趣的可以谷歌一下),他需要用一些用例来得到反馈,也就是说这个优化需要绑定到一个特定的场景。您对一种情况的优化可能会在另一种情况下适得其反。这不是一般优化。所以我们不能简单的包含这些优化,也不能直接发布PGO编译的PHP7。当然,我们正在尝试从PGO中寻找一些通用的优化,然后手动将其应用到PHP7中,但这显然不可能达到针对某个场景进行特殊优化可以达到的效果,所以我决定写这篇文章简单介绍一下如何使用PGO来编译PHP7,让你编译的PHP7尤其可以让你自己的独立应用更快。首先要确定FeedbackGCC在什么场景下使用。我们一般选择:在你要优化的场景中:访问量最大、耗时最久、资源消耗最重的页面。以Wordpress为例,我们选择Wordpress的首页(因为首页往往是访问量最大的)。以我的机器为例:Intel(R)Xeon(R)CPUX5687@3.60GHzX16(超线程),48GMemoryphp-fpm使用固定32个worker,opcache使用默认配置(一定要加载opcache),wordpress4.1为优化场景。首先我们测试下WP在PHP7中的当前性能(ab-n10000-c100):$ab-n10000-c100http://inf-dev-maybach.weibo.com:8000/wordpress/ThisisApacheBench,Version2.3<$修订版:655654$>版权所有1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/LicensedtoTheApacheSoftwareFoundation,http://www.apache。org/Benchmarkinginf-dev-maybach.weibo.com(是patient)Completed1000requestsCompleted2000requestsCompleted3000requestsCompleted4000requestsCompleted5000requestsCompleted6000requestsCompleted7000requestsCompleted8000requestsCompleted9000requestsCompleted10000requestsFinished10000requestsServerSoftware:nginx/1.7.12ServerHostname:inf-dev-maybach.weibo.comServerPort:8000DocumentPath:/wordpress/DocumentLength:9048bytesConcurrencyLevel:100Timetakenfortests:8.957secondsCompleterequests:10000Failedrequests:0Writeerrors:0Totaltransferred:92860000bytesHTMLtransferred:90480000bytesRequestspersecond:1116.48[#/sec](mean)Timeperrequest:89.567[ms](mean)Timeperrequest:0.896[ms](mean,acrossallconcurrentrequests)Transferrate:10124.65[Kbytes/sec]received可以看出本机当前是Wordpress4.1,QPS首页可以达到1116.48。它每秒可以处理如此多的主页请求。现在,让我们教GCC编译和运行Wordpress4.1更快的PHP7。首先,需要GCC4.0或以上版本,但我建议你使用GCC-4.8以上版本(现在都是GCC-5.1)。第一步是下载PHP7的源代码,然后做./configure。这些之间没有区别,然后有区别。我们首先要通过PHP7编译,让它生成生成profile数据的可执行文件:$makeprof-gen注意,我们使用了prof-gen参数(这是PHP7的Makefile特有的,别在其他项目中尝试这样做:))然后,开始训练GCC:$sapi/cgi/php-cgi-T100/home/huixinchen/local/www/htdocs/wordpress/index.php>/dev/null是让php-cgi在wordpress首页运行100次,从而在这个过程中生成一些profile信息。然后,我们开始第二次编译PHP7。$makeprof-clean$makeprof-use&&makeinstallOK,就这么简单,PGO编译完成,现在来看看PGO编译后PHP7的性能:$ab-n10000-c100http://inf-dev-maybach.weibo.com:8000/wordpress/ThisisApacheBench,Version2.3<$Revision:655654$>版权所有1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/LicensedtoTheApacheSoftwareFoundation,http://www.apache.org/Benchmarkinginf-dev-maybach.weibo.com(bepatient)Completed1000requestsCompleted2000requestsCompleted3000requestsCompleted4000requestsCompleted5000requestsCompleted6000requestsCompleted7000requestsCompleted8000requestsCompleted9000requestsCompleted10000requestsFinished10000requestsServerSoftware:nginx/1.7.12ServerHostname:inf-dev-maybach.weibo.comServerPort:8000DocumentPath:/wordpress/DocumentLength:9048bytesConcurrencyLevel:100Timetakenfortests:8.391secondsCompleterequests:10000Failedrequests:0Writeerrors:0Totaltransferred:92860000bytesHTMLtransferred:90480000bytesRequestspersecond:1191.78[#/sec](mean)Timeperrequest:83.908[ms](mean)Timeperrequest:0.839[ms](mean,acrossallconcurrentrequests)传输速率:10807.45[Kbytes/sec]received现在可以每秒处理1191.78QPS,增加了约7%。还不错(咦,你不是说10%吗?怎么变成7%了?呵呵,就像我之前说的,我们尝试分析PGO做了哪些优化,然后手动对PHP7进行一些通用的优化。所以这意味着,~3%的更通用的优化已经包含在PHP7中,当然这项工作仍在进行中)。就这么简单,你可以用自己产品的经典场景来训练GCC,简单几步,得到提升,何乐而不为