web-dev-qa-db-ja.com

HHVMのパフォーマンス低下

コードベースでの互換性とパフォーマンスについてHipHop-PHPを評価していますが、ビルトインWebサーバーを有効にして実行するとパフォーマンスが非常に低下します。

フィボナッチ数列を計算する次のサンプルテストプログラムがあります。

ex3.php:

function fib($n)
{
    if ($n <= 2)
        return 1;
    else
        return fib($n-1) + fib($n-2);
}

$n = 36;
printf("fib(%d) = %d\n", $n, fib($n, 2));

コマンドラインを使用してHHVMでこれを実行すると、印象的な結果が得られます。

time hhvm -v"Eval.Jit=true" -f ./ex3.php
fib(36) = 14930352

real    0m0.267s
user    0m0.248s
sys     0m0.020s

これを標準のPHPと比較してください:

root@hiphop:/www# time php -f ./ex3.php
fib(36) = 14930352

real    0m5.606s
user    0m5.600s
sys     0m0.000s    

ただし、HHVMの組み込みWebサーバーを有効にすると、すべてのパフォーマンスの向上が失われます。

hhvm -v"Eval.Jit=true" -m server -p 8000 &
time wget -qSO - http://localhost:8000/ex3.php
  HTTP/1.1 200 OK
  Content-Type: text/html; charset=utf-8
  X-Powered-By: HPHP
  Date: Sat, 27 Jul 2013 14:16:09 GMT
  Content-Length: 19
fib(36) = 14930352

real    0m5.279s
user    0m0.000s
sys     0m0.000s

ご覧のとおり、HHVMから応答が返されていますが、この要求を処理するのに5秒以上かかります。私は何が欠けていますか?

43
Stephan Edelman

HHVMエンジニアはこちら。

サーバーモードでは、HHVMはインタープリターのみのモード(つまりJITがオフ)で最初に表示されるN個の要求を実行します。

最適化されたビルドのデフォルトはN = 11であるため、リクエストを12回実行すると、12番目のリクエストの方がはるかに高速になります。

次のように設定オプションでこれを調整できます:-v Eval.JitWarmupRequests=3。 0に設定すると、すぐに速度が向上します。

これにはいくつかの理由があります。

まず、一時的なウォームアップ効果がJITでコンパイルされたコードに影響するのを防ぎます。

たとえば、最初のいくつかのリクエストでは、APCに値を入力する必要がある場合があります。これにより、アプリケーションコードが定常状態のパスとは異なるパスをたどります。このようにして、数回しか使用されないJITコンパイルのスペースを無駄にしません。

次に、HHVMがプロファイリング情報を収集して、将来のコンパイルを改善できるようにします。

たとえば、特定の値が99%の時間の整数であることがわかれば、整数の場合に最適化されたコードをコンパイルできます。現在、プロファイリングを有効にしてコードをJITコンパイルする機能はありません(処理が完了したらハード部分は安全に破棄されます)。したがって、インタープリターのみのモードでデータ収集を行います。

101
Owen Yamauchi

同じパフォーマンスの問題があり、/ etc/hhvm/php.iniでこれらの行をコメントした後にのみ印象的な結果が得られます。

;hhvm.log.level = Warning
;hhvm.log.always_log_unhandled_exceptions = true
;hhvm.log.runtime_error_reporting_level = 8191
2
Abdou

hHVM> v3.4の場合、Eval.JitWarmupRequests = 0をEval.JitProfileInterpRequests = 0に変更

 `#!/ usr/bin/hhvm -v Eval.Jit = 1 -v Eval.JitProfileInterpRequests = 0 ./do.php`
2
Lee SunSin