wbenchでWebサイトの総合的パフォーマンスを自動測定
2014/04/02
Webサイトの総合的なパフォーマンス評価を行うとき、どのような方法があるでしょうか?今のところ、デファクトスタンダードと呼べる方法というのはまだ確立していないのではないかと思います。今回はパフォーマンスを評価する方法の1つとして、wbenchというCLIベースのツールを使ったパフォーマンス測定方法を紹介します。
はじめに
パフォーマンス測定にまつわるフロントエンド評価の問題
Webサイトのパフォーマンスを測定する方法として、一般的にはabでHTTPリクエストを投げてレスポンスまでの時間を測定するといった方法、JMeterなどのツールを使うといった方法が考えられます。しかしながら、これらの方法は基本的レスポンスまでのパフォーマンス評価となり、DOM解析やJavaScriptの実行など、フロントエンドに関する領域の評価はできません。
他方、最近のブラウザは、こうしたフロントエンドの分析に非常に役立つツールを標準で備えています。例えばChrome Developer Toolsだと、Networkの項目でリクエスト後の経過をみることができますし、Timelineではレンダリングの速度なども追うことが可能です。ただしこの方法は、クライアントの環境に依存してしまい、同一条件での測定やCLIによる自動化が難しいという問題があります。
wbenchについて
フロントエンドまで含めたパフォーマンス測定を自動化できるツールがないかと探していたところ、CLIベースのwbenchというツールを見つけました。wbenchは、rubyで書かれたWebのパフォーマンス測定を行うためのツールです。Navigation Timingの属性として定義された値を測定することができるようになっています。
内部的にはSelenium WebDrvierとcapybaraを使用して、実際のブラウザの挙動を再現しているようです。今回はこのwbenchを、サーバサイドで実行する方法を含めて紹介したいと思います。
対応ブラウザ
2014/04 現在、FirefoxとChromeに対応しています。デフォルトのブラウザはChromeですが、 -b firefox
とブラウザを指定することにより、Firefoxでも実行可能です(その他のブラウザは今のところ未対応のようです)。
Macであれば上記のGithubのページにあるように、gem install wbench
でインストールできます。
ただし今回はCentOS上で実行できる環境を作るため、仮想フレームバッファ上での実行方法を紹介します。
導入方法
今回実行した環境は以下の通りです。
- CentOS 6.3
- ruby 2.1.1
Firefoxの導入
Firefoxを実行するため、yumでインストールします。CentOS上でFirefoxを利用するようなシーンはSelenium WebDriverを利用する場合くらいしか思いつかないのですが、意外にも特に苦もなく入ります。
1 |
$ sudo yum install firefox |
X Virtual Frame Bufferの導入
Selenium WebDriverを仮想サーバ上で実行させたいので、Xvfbをインストールします。
1 2 |
$ sudo yum groupupdate "X Window System" $ sudo yum install xorg-x11-server-Xvfb |
wbenchの導入
bundle installしてもよいのですが、とりあえず今回は gem install wbench
でインストールしておきます。
1 |
$ gem install wbench |
インストールの確認
うまくwbenchが利用できるかどうかを確認してみます。
1 2 3 4 5 6 7 |
仮想スクリーン立ち上げ $ DISPLAY=:1.0 $ export DISPLAY $ Xvfb :1 -screen 0 1024x768x24 & wbenchの実行 $ wbench -l 1 -b firefox "http://www.yahoo.co.jp" |
これで、以下のようにその結果が表示されれば成功と言えるでしょう。
1 |
D-Bus library appears to be incorrectly set up; failed to read machine uuid: |
と言われた場合は、
1 |
# dbus-uuidgen > /var/lib/dbus/machine-id |
としてやれば、正常に動作すると思います。
-l オプションは実行回数なので、適当に指定してやることで実行回数を変更することができます。
APIを利用した結果の取得
さて、wbenchの出力結果をそのままパースしてもよいのですが、wbenchはrubyから呼び出すことも可能です。wbench自身がrubyで記述されていることを考えれば、ある意味当然ともいえますね。
非常にアドホックな例ですが、以下のように利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
require 'wbench' url = "http://www.yahoo.co.jp" benchmark = WBench::Benchmark.new(url, :browser => :firefox) results = benchmark.run(1) puts results.browser # => { "navigationStart"=>[0], "fetchStart"=>[3], "connectEnd"=>[3], "connectStart"=>[3], "domainLookupStart"=>[24], "domainLookupEnd"=>[5065], "requestStart"=>[5102], "responseStart"=>[5172], "domLoading"=>[5174], "responseEnd"=>[5233], "domInteractive"=>[11075], "domContentLoadedEventStart"=>[11087], "domContentLoadedEventEnd"=>[11090], "loadEventStart"=>[26456], "domComplete"=>[26456], "loadEventEnd"=>[26515] } |
結果を実行時のメタ情報とともにMongoDBに保存できるようにしておき、ジョブとして登録しておけば、あとでデータを抽出してボトルネックとなっているページを探したり、視覚化して改善の余地があるページを探すことにも役立ちそうです。
おわりに
Webサイトのパフォーマンス向上は重要なテーマですが、デバイスや環境によってその値はさまざまだと思います。部分的に改善試作を施すことは可能でも、それがトータルで見た時に本当に全体のパフォーマンス改善へ寄与するものなのか?を判断するのは難しい問題です。
テストやビルドの自動化が頻繁にトピックとしてあげられるのに比べ、こうしたパフォーマンス測定の自動化に関する話題はそう多くなく、まだまだ発展の余地があるのではないかと思っています。さらなるベストプラクティスの登場を期待したいところです。