おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

HHVMで性能テストもどきしてみた

HHVMをせっかくインストールしてみたので、今回は本当にHHVMは通常のPHPよりも速いのかの性能テストをしてみました。

環境

MacAirにVagrantで以下の環境を構築して比較を行ってみる。

  • ubuntu14.04 + nginx + HHVM(Hackコード)
  • ubuntu14.04 + apache2 + php5.5

(より本番環境を想定するとローカルサーバーは良くないのでは(・・?))

ソースコードはあんまりいいものが思いつかずFizzBuzz問題を使用することにした。
ループ回数を100, 10000, 1000000回で実施した。

fizzbuzz.php

<?php
  for($i = 1; $i < 1000000; $i++){
    if($i % 15 == 0){
      print("FizzBuzz\n");
    }else if( $i % 3 == 0){
      print("Fizz\n");
    }else if( $i % 5 == 0){
      print("Buzz\n");
    }else{
      print($i."\n");
    }
  }

Hackのコードは冒頭の<?phpの部分を<?hhに変更するだけでよい。

Apache Bench

ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4

Apacheをインストールするとデフォルトでくっついてくる
サクッとお手軽に負荷テストができるApache Benchというものがあるので今回はこれを使う。

AB(Apache Bench)の使い方

ab -n リクエストの総数 -c クライアント数(ユーザー数)

ab -n 100 -c 100 http://192.168.33.10/hello.php

結果の見方

f:id:orange_lily27:20150522111510p:plain

結果はこんな感じで返ってくる。それぞれの意味合いは以下のようになる。

結果 説明
Concurrency Level クライアントの数、-cの後の値が返ってくるはず
Time taken for tests 接続時間
Complete requests 成功したリクエストの数
Failed requests 失敗したリクエストの数
Requests per second 1秒当たりに処理できるリクエスト数
Time per request(mean, across all concurrent requests) 1リクエスト当たりの処理時間

Concurrency Levelを徐々に増やしていき、Failed requestsが発生した時点がそのサーバーの処理限界ということになる。

測定結果

HHVMと通常のPHP環境それぞれにFizzBuzzのループ回数を増やしていき、以下のコマンドを5回づつ実施した。

ab -n 250 -c 250 http://192.168.33.10/fizzbuzz.php 

それぞれのRequests per secondの結果を以下に示す。

100ループ

HHVM + nginx PHP + apache2
1回目 507.72 548.80
2回目 506.23 543.82
3回目 509.12 542.11
4回目 505.88 546.89
5回目 507.35 544.71
平均値 507.26 545.27

同じくらいかどちらかというと通常のPHPの方が処理速度が速いことが分かる。

1万ループ

HHVM + nginx PHP + apache2
1回目 564.48 230.76
2回目 565.06 232.59
3回目 564.84 228.59
4回目 562.77 231.54
5回目 558.20 236.23
平均値 563.07 231.94

通常のPHPがループ回数を100倍したことにより処理速度が1/2以上落ち込んでいる。一方で、HHVMの方は100ループの時よりも100000ループの方が処理速度が変わらないどころかちょっと速いという謎の結果になった。

100万ループ

HHVM + nginx PHP + apache2
1回目 572.52 2.62
2回目 558.95 2.64
3回目 570.53 2.65
4回目 567.62 2.67
5回目 559.75 2.83
平均値 565.87 2.68

ここまでループ回数を増やすとHHVMの方が圧倒的に速い。200倍以上速いことになっている。それとHHVMの特徴として目につくのはループ回数を増やしても性能がほとんど変化していないということである。