
今日は、スピードのために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
フェイスブック
コミュニティ
ここでは、テクノロジーについて読むことができます:
英語版ウィキペディア
ロシア語版ウィキペディア