让你的 PHP 7 更快 GCC PGO

WBOY
发布: 2016-08-08 09:22:12
原创
1625 人浏览过

我们一直致力于提升PHP7的性能,  上个月我们注意到GCC的PGO能在Wordpress上能带来近10%的性能提升,  这个让我们很激动.

让你的 PHP 7 更快 GCC PGO

然而,  PGO正如名字所说(Profile Guided Optimization 有兴趣的可以Google), 他需要用一些用例来获得反馈, 也就是说这个优化是需要和一个特定的场景绑定的.

你对一个场景的优化, 也许在另外一个场景就事与愿违了.  它不是一个通用的优化. 所以我们不能简单的就包含这些优化, 也无法直接发布PGO编译后的PHP7.

当然, 我们正在尝试从PGO找出一些共性的优化,  然后手工Apply到PHP7上去, 但这个很明显不能做到针对一个场景的特别优化所能达到的效果,  所以我决定写这篇文章简单介绍下怎么使用PGO来编译PHP7, 让你编译的PHP7能特别的让你自己的独立的应用变得更快.

首先,  要决定的就是拿什么场景去Feedback GCC,  我们一般都会选择: 在你要优化的场景中: 访问量最大的, 耗时最多的, 资源消耗最重的一个页面.

拿Wordpress为例,  我们选择Wordpress的首页(因为首页往往是访问量最大的).

我们以我的机器为例:

<ol>
<li><span><span>Intel(R) Xeon(R) CPU           X5687  @ 3.60GHz X 16(超线程), </span></span></li>
<li><span> </span></li>
<li><span>48G Memory </span></li>
</ol>
登录后复制

php-fpm 采用固定32个worker, opcache采用默认的配置(一定要记得加载opcache)

以wordpress 4.1为优化场景..

首先我们来测试下目前WP在PHP7的性能(ab -n 10000 -c 100):

<ol>
<li><span><span>$ ab -n 10000 -c 100 http:</span><span>//inf-dev-maybach.weibo.com:8000/wordpress/</span><span> </span></span></li>
<li><span> </span></li>
<li>
<span>This is ApacheBench, Version 2.3 $Revision</span><span>: 655654 $> </span>
</li>
<li><span> </span></li>
<li><span>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http:<span>//www.zeustech.net/</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Licensed to The Apache Software Foundation, http:<span>//www.apache.org/</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Benchmarking inf-dev-maybach.weibo.com (be patient) </span></li>
<li><span> </span></li>
<li><span>Completed 1000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 2000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 3000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 4000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 5000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 6000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 7000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 8000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 9000 requests </span></li>
<li><span> </span></li>
<li><span>Completed 10000 requests </span></li>
<li><span> </span></li>
<li><span>Finished 10000 requests </span></li>
<li><span> </span></li>
<li><span>Server Software:        nginx/1.7.12 </span></li>
<li><span> </span></li>
<li><span>Server Hostname:        inf-dev-maybach.weibo.com </span></li>
<li><span> </span></li>
<li><span>Server Port:            8000 </span></li>
<li><span> </span></li>
<li><span>Document Path:          /wordpress/ </span></li>
<li><span> </span></li>
<li><span>Document Length:        9048 bytes </span></li>
<li><span> </span></li>
<li><span>Concurrency Level:      100 </span></li>
<li><span> </span></li>
<li><span>Time taken <span>for</span><span> tests:   8.957 seconds </span></span></li>
<li><span> </span></li>
<li><span>Complete requests:      10000 </span></li>
<li><span> </span></li>
<li><span>Failed requests:        0 </span></li>
<li><span> </span></li>
<li><span>Write errors:           0 </span></li>
<li><span> </span></li>
<li><span>Total transferred:      92860000 bytes </span></li>
<li><span> </span></li>
<li><span>HTML transferred:       90480000 bytes </span></li>
<li><span> </span></li>
<li><span>Requests per second:    1116.48 [#/sec] (mean) </span></li>
<li><span> </span></li>
<li><span>Time per request:       89.567 [ms] (mean) </span></li>
<li><span> </span></li>
<li><span>Time per request:       0.896 [ms] (mean, across all concurrent requests) </span></li>
<li><span> </span></li>
<li><span>Transfer rate:          10124.65 [Kbytes/sec] received </span></li>
</ol>
登录后复制

可见Wordpress 4.1 目前在这个机器上, 首页的QPS可以到1116.48. 也就是每秒钟可以处理这么多个对首页的请求,

现在, 让我们开始教GCC, 让他编译出跑Wordpress4.1更快的PHP7来,  首先要求GCC 4.0以上的版本, 不过我建议大家使用GCC-4.8以上的版本(现在都GCC-5.1了).

第一步, 自然是下载PHP7的源代码了,  然后做./configure. 这些都没什么区别

接下来就是有区别的地方了, 我们要首先第一遍编译PHP7, 让它生成会产生profile数据的可执行文件:

<ol><li><span><span>$ make prof-gen <br></span></span></li></ol>
登录后复制

注意, 我们用到了prof-gen参数(这个是PHP7的Makefile特有的, 不要尝试在其他项目上也这么搞哈 :) )

然后, 让我们开始训练GCC:

<ol><li><span><span>$ sapi/cgi/php-cgi -T </span><span>100</span><span> /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/</span><span>null</span><span> </span></span></li></ol>
登录后复制

也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.

然后, 我们开始第二次编译PHP7.

<ol>
<li><span><span>$ make prof-clean </span></span></li>
<li><span>$ make prof-<span>use</span><span> && make install </span></span></li>
</ol>
登录后复制

好的, 就这么简单,  PGO编译完成了,  现在我们看看PGO编译以后的PHP7的性能:

<ol>
<li><span><span>$ ab -n10000 -c </span><span>100</span><span> http:</span><span>//inf-dev-maybach.weibo.com:8000/wordpress/</span><span> </span></span></li>
<li><span> </span></li>
<li><span>This is ApacheBench, Version <span>2.3</span><span> <span>655654</span><span> $> </span></span></span></li>
<li><span> </span></li>
<li><span>Copyright <span>1996</span><span> Adam Twiss, Zeus Technology Ltd, http:</span><span>//www.zeustech.net/</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Licensed to The Apache Software Foundation, http:<span>//www.apache.org/</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Benchmarking inf-dev-maybach.weibo.com (be patient) </span></li>
<li><span> </span></li>
<li><span>Completed <span>1000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>2000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>3000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>4000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>5000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>6000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>7000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>8000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>9000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Completed <span>10000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Finished <span>10000</span><span> requests </span></span></li>
<li><span> </span></li>
<li><span>Server Software:        nginx/<span>1.7</span><span>.</span><span>12</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Server Hostname:        inf-dev-maybach.weibo.com </span></li>
<li><span> </span></li>
<li><span>Server Port:            <span>8000</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Document Path:          /wordpress/ </span></li>
<li><span> </span></li>
<li><span>Document Length:        <span>9048</span><span> bytes </span></span></li>
<li><span> </span></li>
<li><span>Concurrency Level:      <span>100</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Time taken <span>for</span><span> tests:   </span><span>8.391</span><span> seconds </span></span></li>
<li><span> </span></li>
<li><span>Complete requests:      <span>10000</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Failed requests:        <span>0</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Write errors:           <span>0</span><span> </span></span></li>
<li><span> </span></li>
<li><span>Total transferred:      <span>92860000</span><span> bytes </span></span></li>
<li><span> </span></li>
<li><span>HTML transferred:       <span>90480000</span><span> bytes </span></span></li>
<li><span> </span></li>
<li><span>Requests per second:    <span>1191.78</span><span> [#/sec] (mean) </span></span></li>
<li><span> </span></li>
<li><span>Time per request:       <span>83.908</span><span> [ms] (mean) </span></span></li>
<li><span> </span></li>
<li><span>Time per request:       <span>0.839</span><span> [ms] (mean, across all concurrent requests) </span></span></li>
<li><span> </span></li>
<li><span>Transfer rate:          <span>10807.45</span><span> [Kbytes/sec] received </span></span></li>
</ol>
登录后复制

现在每秒钟可以处理1191.78个QPS了,  提升是~7%.  还不赖哈(咦, 你不是说10%么? 怎么成7%了?  呵呵, 正如我之前说过, 我们尝试分析PGO都做了些什么优化, 然后把一些通用的优化手工Apply到PHP7中. 所以也就是说, 那~3%的比较通用的优化已经包含到了PHP7里面了, 当然这个工作还在继续).

于是就这么简单, 大家可以用自己的产品的经典场景来训练GCC, 简单几步, 获得提升, 何乐而不为呢 :)

thanks

编者注:本文是 PHP 大神 —— 鸟哥 @Laruence 的作品,原文地址:http://www.laruence.com/2015/06/19/3063.html

以上就介绍了让你的 PHP 7 更快 GCC PGO,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!