PHP7 は、いくつかのバグ修正と最新のパフォーマンス改善 (ニュース) の 1 つである「HugePageFy PHP TEXT セグメント」を含む RC4 をリリースしました。この機能を有効にすると、PHP7 は次のようになります。独自の TEXT セグメント (実行本体) を Huagepage に「移動」します。これまでのテストでは、WordPress で QPS が 2% ~ 3% 増加することが着実に確認できました。
Hugepageとは何かというと、簡単に言うとデフォルトのメモリを4KB単位でページングしており、仮想アドレスとメモリアドレスを変換する必要があり、この変換にはテーブルルックアップが必要になります。ルックアップでは、CPU テーブル プロシージャにはすべて TLB (Translation Lookaside Buffer) が組み込まれています。明らかに、仮想ページが小さい場合、テーブル内のエントリの数は多くなり、TLB サイズは制限されます。エントリが多いほど、 , TLB のキャッシュ ミスが高くなるので、大きなメモリ ページを有効にできれば、間接的にこの TLB キャッシュ ミスを減らすことができます。詳しい紹介については、Google でいろいろ調べたので割愛します。この新機能を有効にして、明らかにパフォーマンスを向上させる方法を主に説明します。
新しいカーネルで Hugepage を有効にするのは非常に簡単になりました。開発仮想マシン (Ubuntu Server 14.04、カーネル 3.13.0-45) を例として、メモリ情報を表示すると、次のようになります。
$ cat /proc/meminfo | grep Huge AnonHugePages: 444416 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kBHugepage のサイズは 2MB で、HugePages は現在有効になっていないことがわかります。次に、最初に PHP RC4 をコンパイルしましょう。 --disable-huge-code-pages (この新機能は追加しないように注意してください)デフォルトで有効になっている場合は、「これをオフにする)」を追加します)次に、opcache を設定します。PHP5.5 以降、Opcache はデフォルトでコンパイルが有効になっていますが、動的ライブラリのコンパイルに使用されるため、引き続き設定する必要があります。 php.ini で設定してロードします。
zend_extension=opcache.soこの新機能は Opcache に組み込まれているため、この機能は Opcache を通じて (opcache.huge_code_pages=1 を設定することにより) 有効にする必要があります。特定の設定:
opcache.huge_code_pages=1次に OS を設定しましょう。いくつかの Hugepages を割り当てます:
$ sudo sysctl vm.nr_hugepages=128 vm.nr_hugepages = 128次に、メモリ情報をもう一度確認してみましょう:
$ cat /proc/meminfo | grep Huge AnonHugePages: 444416 kB HugePages_Total: 128 HugePages_Free: 128 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB割り当てた 128 Hugepages の準備ができていることがわかります。その後、php-fpm を開始します:
$ /home/huixinchen/local/php7/sbin/php-fpm [01-Oct-2015 09:33:27] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root [01-Oct-2015 09:33:27] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as rootさて、もう一度メモリ情報を確認してください:
$ cat /proc/meminfo | grep Huge AnonHugePages: 411648 kB HugePages_Total: 128 HugePages_Free: 113 HugePages_Rsvd: 27 HugePages_Surp: 0 Hugepagesize: 2048 kBそういえば、Hugepages が利用可能な場合、Opcache は実際に Hugepages を使用してオペコード キャッシュを保存します。その結果、opcache.huge_code_pages を閉じて、再度開始してメモリ情報を確認することもできます:
$ cat /proc/meminfo | grep Huge AnonHugePages: 436224 kB HugePages_Total: 128 HugePages_Free: 117 HugePages_Rsvd: 27 HugePages_Surp: 0 Hugepagesize: 2048 kBhuge_code_pages をオンにすると、fpm は開始後にさらに 4 ページを使用することがわかります。 php-fpm のテキスト サイズ:
$ size /home/huixinchen/local/php7/sbin/php-fpm text data bss dec hex filename 10114565 695200 131528 10941293 a6f36d /home/huixinchen/local/php7/sbin/php-fpmテキスト セグメントのサイズは 10114565 バイトで、合計約 4.8 ページの 2M が必要であることがわかります。 200 万ページ未満のページは移動されません)、4 ページを申請します。これはまさに私たちが確認しているとおりです。一貫性があります。 構成が成功したことを示します。お楽しみください しかし、最初に言わなければなりません。この機能を有効にした後、問題が発生します。Perf レポート/anno を介してプロファイリングしようとすると、シンボルが失われることがわかります (valgrind、gdb は影響を受けません)主な理由は、Perf が mmap を監視し、アドレス範囲を記録し、IP をシンボルに変換するように設計されていることですが、現在 HugeTLB は MAP_ANON のみをサポートしているため、Perf はアドレスのこの部分にはシンボル情報がないと考えています。カーネルの将来のバージョンでこの制限は修正される可能性があります... 推奨チュートリアル: "
PHP7"
以上がPHP7を高速化するHugepageの詳細解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。