PHP 7 を高速化する GCC PGO

WBOY
WBOYオリジナル
2016-08-08 09:22:121662ブラウズ

私たちは PHP7 のパフォーマンスを向上させるために熱心に取り組んできました。先月、GCC の PGO が WordPress のパフォーマンスを 10% 近く向上させることができることに気づきました

PHP 7 を高速化する GCC PGO

しかし、PGO はその名の通りです。前述したように (プロファイルに基づく最適化、興味がある場合は Google で調べてください)、フィードバックを得るにはいくつかのユースケースを使用する必要があります。つまり、この最適化は特定のシナリオにバインドする必要があります。あるシナリオが別のシナリオにある可能性があります。これは普遍的な最適化ではありません。したがって、これらの最適化を単純に組み込むことはできません。また、PGO によってコンパイルされた PHP7 を直接リリースすることもできません。

もちろん、私たちは PGO からいくつかの共通の最適化を見つけようとしています。 、そして PHP7 に手動で適用しますが、これではシーンの特別な最適化が達成できるような効果は明ら​​かに達成できません。そこで、PGO を使用して PHP7 をコンパイルする方法を簡単に紹介するためにこの記事を書くことにしました。これにより、コンパイルした PHP7 は特別な独自の独立したアプリケーションをより高速に作成します

まず第一に、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 ワーカーを使用し、opcache はデフォルト設定を使用します (必ず opcache をロードしてください)

最適化シナリオとして wordpress 4.1 を使用します。

まず、PHP7 で WP の現在のパフォーマンスをテストしてみましょう (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 <<span>$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 に達することができます。つまり、1 秒あたり非常に多くのリクエストを処理できることがわかります。

それでは、GCC の学習を開始し、WordPress 4.1 をコンパイルして実行してみましょう。より高速な PHP7 が登場するため、最初は GCC 4.0 以降が必要ですが、GCC-4.8 以降 (現在は GCC-5.1

) を使用することをお勧めします。最初のステップは、PHP7 のソース コードをダウンロードし、次に ./configure を実行することです。これらに違いはありません

次に、最初に PHP7 をコンパイルし、実行可能ファイルを生成する必要があります。プロファイル データを生成します:

<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>
つまり、WordPress ホームページ上で php-cgi を 100 回実行し、その過程でいくつかのプロファイル情報を生成します。

その後、2 回目の 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>
OK、とても簡単です。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> <$Revision: </span><span>655654</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>
これで、1 秒あたり 1191.78 QPS を処理できるようになり、改善は ~7% です。悪くありません (10% って言いませんでしたか? どうしてですか) 7% ですか? はは、前に述べたように、PGO が行った最適化を分析してから、いくつかの一般的な最適化を PHP7 に手動で適用しようとしています。 つまり、もちろん、より一般的な最適化の ~3% が PHP7 に含まれているということです。

とても簡単なので、いくつかの簡単な手順で GCC をトレーニングできます:)

ありがとうございます。

編集者注: この記事は PHP マスター ——Bird Brother @Laruence の作品によって書かれています。元のアドレス: http://www.laruence.com/2015/06/19/3063.html

上記は、PHP 7 を高速化するための GCC PGO を紹介しました。内容も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。