HHVM(ヒップホップ):ベンチマークとチューニング

画像



今日は、スピードのためにHHVMを使用して、または使用せずにphpスクリプトをテストした結果を共有します。また、Fedora 20などで実装方法をすぐに確認します。 -hop)は、PHPおよびHACKで記述されたプログラムを実行するために設計されたオープン仮想マシンです。 JITコンパイルを使用し、Facebookで開発されました。







テスト:HHVM + NGINX + FASTCGI vs. PHP-FPM + NGINX





テストスクリプトは、多くの正規表現、算術演算、およびデータベースの呼び出しです。



理想的には、hhvmの速度をテストするために、スクリプトはデータベースへのアクセス権を持たないようにする必要があります。スクリプトは時事問題に必要なため、テストにのみ存在します。



ソフト:

Fedora 20

HipHop VM 2.4.0(rel)

nginx / 1.4.4

PHP 5.5.12




テスト用ソフトウェア:ab。

10スレッドで3000スクリプト要求。



純粋なhhvm 13.665秒



同時実行レベル:10

テストにかかった時間:13.665秒

完全なリクエスト:3000

失敗したリクエスト:0

転送された合計:2142000バイト

転送されるHTML:1842000バイト

1秒あたりのリクエスト:219.54 [#/秒](平均)

リクエストあたりの時間:45.549 [ms](平均)

リクエストあたりの時間:4.555 [ms](平均、すべての同時リクエスト全体)

転送速度:153.08 [Kバイト/秒]受信




nginx-fastcgi-php 31.406秒



同時実行レベル:10

テストにかかった時間:31.406秒

完全なリクエスト:3000

失敗したリクエスト:0

転送された合計:2328000バイト

転送されるHTML:1842000バイト

1秒あたりのリクエスト:95.52 [#/ sec](平均)

リクエストあたりの時間:104.688 [ms](平均)

リクエストあたりの時間:10.469 [ms](平均、すべての同時リクエスト全体)

転送速度:72.39 [Kバイト/秒]受信





結論:hhvmは2.29倍高速です。



スクリプト内のコードフラグメントの測定:



画像



画像



チャートは、1000を超える測定値の平均に基づいてプロットされます。



コードフラグメントの測定結果によると、HHVMはNGINX-FASTCGI-PHPより2.77倍高速であることが明らかです。

グラフでは、青はコードの最も加速されたセクション(レギュラーの質量)を示し、113倍加速されました!



実用化




タスク:多くのリクエストを処理するプロジェクトがあります。 このプロジェクトによると-約10サーバー。 リソースを数回削減する必要があります。サーバーの数を減らすか、データを減らします。



解決策: HHVMのパフォーマンスを加速する仮想マシンがサーバーにインストールされ、それを介してphpスクリプトの実行を実行できます。 結果:必要な加速。



この方法でより適切に解決すればするほど、規模は大きくなります:これが数万台のサーバーが関与するFacebook規模(HHVMの作成者)の大規模プロジェクトである場合、それらを2から3倍に減らすと具体的な結果が得られます。 テストの結果によると、コードの一部のセクションでは113回オーバークロックできますが、それについては後で詳しく説明します。



もちろん、すべてに長所と短所があります。HHVMも例外ではないため、すぐに示すことをお勧めします。



長所:

•PHP実行の高速化(多数のレギュラーブロックでのテストでは、113回の加速がありました。一般的に、データベースへの呼び出し回数が多いため、テストスクリプトは2倍まで加速されました)。



短所:

•php-mysqliをサポートしていません(mysqlまたはPDOを使用する必要があります)

•ファイルの終わりの予期しない会議に関するPHPエラーでサーバーがクラッシュしました(サーバーを再起動した後、引き続き動作しました)。



展開:Fedora 20でのHHVM PHP(ヒップホップ)のインストールと構成





画像



もちろん、HHVMを使用してPHPを高速化することは非常に明白であり、おそらく、Fedoraの場合でも誰かがすでにそれを行っているでしょう。 しかし、このトピックに関するロシアの情報源には、私たちが望むよりもはるかに少ない情報があるので、今日はFedoraにそれをインストールして作業を確認する方法を最初から最後まで、小さいながら完全に自給自足のチュートリアルを共有しています。



私はFedora 20を使用しましたが、他のOSのセットアップは基本的に同様であり、それらの英語ソースへのリンクは投稿の最後にあります。 便利なことに、現在、既製のパッケージは1つのチームによって配置されています。手動で組み立てる必要はありません。 HHVMのd明期には、オープンソースをインストールするのは困難でしたが、幸いなことに過去にあります。今、マニュアルに従えば、すべてをインストールして、原則として1時間で確認できます。 セットアップとインストールは、6つの連続したステップに収まります。



ステップ1:システムへのリポジトリの追加




まず、リポジトリをシステムに追加します。 これを行うには、/ /etc/yum.repos.d/hhvm.repo



を編集するためのファイルを作成して開きます



これは、たとえば次のように実行できます。

vi /etc/yum.repos.d/hhvm.repo







次の行を書き込みます。

 [hhvm] name=HHVM for Fedora $releasever - $basearch baseurl=http://dl.hhvm.com/fedora/$releasever/$basearch/
      
      







viエディターを使用する場合、ファイルを開いた後、「i」を押してから行を入力し、Escを押してからShift + z + zを押します。



次に、HHVMをインストールします。

rpm --import dl.hhvm.com/conf/hhvm.gpg.key

yum install hhvm








インストール中に、必要なコンポーネントのインストールに関するダイアログが表示されます(これでよろしいですか[y / d / N] :)。 コマンドで「はい」と答えます。

y







その後、インストールされたコンポーネントのリストが表示され、最後に「Complete!」という行が表示されます。



次に、構成の編集に進みます- /etc/hhvm/config.hdf.







たとえば、次のように:



vi /etc/hhvm/config.hdf







動作する構成の例を次に示します(ほとんどの場合、ルートパスのみを変更する必要があります)。

 Log { Level = Error UseLogFile = true File = /var/log/hhvm-error.log Access { * { File = /var/log/hhvm-access.log Format = %h %l %u %t \"%r\" %>s %b } } } MySQL { TypedResults = false } Server { Port = 4849 #     hhvm SourceRoot = /home/www/site/public_html #    php  Type = fastcgi #ThreadCount = 50 } Eval { # set to true to enable JIT compiler # If hhvm crashes you can turn this off to see if the problem # is in the JIT. Jit = true }
      
      







デフォルトの構成を上記の推奨構成に置き換え、ルートパスを編集します。



ステップ2:HHVMを起動する




これで、HHVMを開始できます。 ここには、サーバーモードまたはデーモンモードで起動する2つのオプションがあります。



サーバーモードで実行-コンソールエラーなどに直接出力しhhvm -m server -c /etc/hhvm/config.hfd



hhvm -m server -c /etc/hhvm/config.hfd







デーモンモードでの実行-バックグラウンド作業: hhvm -m daemon -c /etc/hhvm/config.hfd







hhvm config- Type = fastcgi (#Type = fastcgi)



でコメントすると、すぐにその動作を確認できます。 構成を編集した後、hhvmを再起動する必要があります。



hhvmをデーモンモードで再起動するには、次のように入力します。

netstat -lnp







プログラムとそのpidのリストを確認し、hhvmを見つけ、そのpidをコピーして、コマンドを入力します。 kill pid



このコマンドでは、pidをリストにあるプロセス番号に置き換えます。 netstat -lnpを再入力して、プロセスが停止していることを確認します。 次に、いずれかのmodでhhvmを実行します。



サーバーモードでhhvmを再起動するには、Ctrl + cを押してから、いずれかのmodでhhvmを実行します。



ステップ3:PHPスクリプトを追加する




これらの操作の後、phpスクリプトをhhvm構成で指定されたルートディレクトリに配置します。



次のように彼に目を向けます。

___:4849/_php_.php







処理されたphpスクリプトが表示されない場合は、コンソール(hhvm -mサーバーの場合)、またはコマンドtail /var/log/hhvm-error.log



エラーログファイル(hhvm -mデーモンの場合)でエラーログを確認します。



さらに、hhvmをテストし、 Type = fastcgi



Type = fastcgi



をコメント化した場合は、コメントを外してhhvmを再起動します。 これを行わなかった場合は、すべてをそのままにして先に進みます。



ステップ4:NGINXを構成する




hhvmでfastcgiを転送するようにnginxを構成します。 これを行うには、nginxの設定を変更します。ここは/etc/nginx/nginx.confです。 次のエントリが表示されます。

 location ~ \.php$ { #      (/home/www/site/public_html). root /home/www/site/public_html; fastcgi_pass 127.0.0.1:4849; #    hhvm fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/site/public_html$fastcgi_script_name; include fastcgi_params; }
      
      







残りのnginx設定は好みに合わせて設定します(主なことは、ポート80-サーバー{listen 80;}をリッスンすることです)。 その後、次のコマンドでnginxを再起動します。

nginx -s reload







これで、ポート80の前にhhvm-ポート4849の後ろにnginxの束ができました。



ステップ5:HHVM + NGINX + FASTCGIを確認する




アドレスをリクエストします: change_on_ own_domain / script_php_name.php

処理されたphpスクリプトが表示されます。

nginxとhhvmを含めることを忘れないでください。

スクリプトが表示されない場合は、エラーログを見てみましょう。 hhvm -mサーバーの場合、コンソールで直接、エラーログファイルのhhvm -mデーモンの場合、たとえば次のようになります。

tail /var/log/hhvm-error.log







ここでは、念のため、多数のc hhvmに対する有効なnginx構成:



 user apache; worker_processes 10; events { worker_connections 1000; } worker_rlimit_nofile 50000; http { include mime.types; default_type application/octet-stream; log_format my_combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$upstream_response_time "$host"' sendfile on; keepalive_timeout 10; limit_zone lconn $binary_remote_addr 10m; server { client_max_body_size 1000k; fastcgi_read_timeout 1m; listen 8080; listen 80; server_name site.ru; #    access_log /var/log/nginx/site.ru-access_log my_combined; #    error_log /var/log/nginx/site.ru-error_log; #    limit_conn lconn 100; root /home/www/site/public_html; #    index index.php index.html index.htm; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { root /home/www/site/public_html; #    fastcgi_pass 127.0.0.1:4849; fastcgi_index index.php; #    fastcgi_param SCRIPT_FILENAME /home/www/site/public_html$fastcgi_script_name; include fastcgi_params; } } }
      
      







ステップ6:HHVMをスタートアップに追加する




hhvmを常に使用する場合は、自動読み込みに追加する必要があります。



次のように、編集用にファイル-/etc/init.d/hhvmを開きます。



vi /etc/init.d/hhvm







すべてのコンテンツを次のものに置き換えます。

 #! /bin/sh # # hhvm Daemon for HHVM # # chkconfig: 2345 20 20 # # description: HHVM is an open-source virtual machine designed for executing programs written in Hack and PHP test -x /usr/bin/hhvm || exit 0 case "$1" in start) /usr/bin/hhvm --config /etc/hhvm/config.hdf --mode daemon ;; stop) start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/hhvm/pid ;; reload|force-reload|restart|try-restart) $0 stop $0 start ;; status) echo "No status" ;; *) echo "Usage: /etc/init.d/hhvm {start|stop|restart|status}" exit 1 esac exit 0
      
      







保存します。

次に、コマンドを入力します。

chkconfig hhvm on







できた! hhvmデーモンはシステムの起動時に起動します。



もちろん、それぞれに独自のパスがあります。どのように具体的に統合するか、誰もが自分で決定します。 それにもかかわらず、ここではすべてがそのように機能し、最小限の時間で集まっています-サーバーの数をかなり節約する必要がある場合、特にオープンソースソリューションに基づいてそれを行うことができる場合、ライブ状態でそれを使用することはかなり可能だと思います。



ここで彼らは以前にこれについて書いた:

復習

NginxにHHVMをインストールする

テスト:HHVMとネイティブインタープリターの比較



ここで、パブリックドメインでHHVMを取得できます。

Github

フェイスブック

コミュニティ



ここでは、テクノロジーについて読むことができます:

英語版ウィキペディア

ロシア語版ウィキペディア



All Articles