ホームページ  >  記事  >  バックエンド開発  >  PHP7を高速化するHugepageの詳細解説

PHP7を高速化するHugepageの詳細解説

Guanhui
Guanhui転載
2020-06-09 09:21:533098ブラウズ

PHP7を高速化するHugepageの詳細解説

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 kB

Hugepage のサイズは 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 kB

huge_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 サイトの他の関連記事を参照してください。

声明:
この記事はlaruence.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。