僕が運営しているサイトの中で一番アクセスのあるエロサイトがありまして( not YourAVHost! )、 内部的には主に、gearman の worker をキックしたり、履歴を表示するだけの簡単なお仕事をしているサービスです。 公開当初は Catalyst をフレームワークとしていたのですが、 リソースを節約するために現在は Plack ベースの自作超シンプルWAF(?)「Noe」ってのを使っています。
これをより高速化するためにちょいとチューニングをしてみました。 その運用しているサイトではないのですが、Noe のサンプルアプリを対象にして ab で計測してみました。 サンプルアプリは YAML 形式の設定ファイルから変数を受け取り、テンプレートでレンダリングするというものです。 ab は以下のような簡単なコマンドを叩きました。
$ sudo ab -n 100 http://192.168.1.xxx:5000/
では、順を追ってチューニングされる手順を見ていきます。 ちなみに、主に使用しているモジュールのバージョンはこの通りです。
Plack 0.9013 Template 2.20 Text::MicroTemplate 0.10
まずはチューニング以前のものを計測してみます。
Requests per second: 56.72 [#/sec] (mean) Time per request: 17.631 [ms] (mean) Time per request: 17.631 [ms] (mean, across all concurrent requests) Transfer rate: 44.24 [Kbytes/sec] received
最初のチューニングとして、テンプレートエンジンにTTを使用していたので、 これをTTと比べて軽量と言われかつ記法も柔軟なText::MicroTemplate::Extendedに変えてみましょう。
Requests per second: 60.01 [#/sec] (mean) Time per request: 16.664 [ms] (mean) Time per request: 16.664 [ms] (mean, across all concurrent requests) Transfer rate: 45.01 [Kbytes/sec] received
おお、そこまで激的では無いにしろ「105%」速くなってますね! 次に内部で YAML モジュールを使っていたところを YAML::XS にしてみます。 これは期待できそうですね!
Requests per second: 66.53 [#/sec] (mean) Time per request: 15.032 [ms] (mean) Time per request: 15.032 [ms] (mean, across all concurrent requests) Transfer rate: 49.89 [Kbytes/sec] received
おお、いい感じですね!チューニング前と比べると「117%」速くなっています。 でも、もっと速くしたい!と思ったところ 「ディレクトリ等のパスの解決に使っている Path::Class モジュールが無駄じゃね?」 と思いそれを取り除いて素の文字列でパスを扱ってみました。
Requests per second: 76.71 [#/sec] (mean) Time per request: 13.036 [ms] (mean) Time per request: 13.036 [ms] (mean, across all concurrent requests) Transfer rate: 59.83 [Kbytes/sec] received
おおお、今まで一番速くなった! チューニング前と比較して「135%」高速化されています。 で、最後のチューニングは、「これ Mouse 使うのやめればへえーんじゃね?」 と思って素でクラス作ってみました。
Requests per second: 78.14 [#/sec] (mean) Time per request: 12.797 [ms] (mean) Time per request: 12.797 [ms] (mean, across all concurrent requests) Transfer rate: 60.95 [Kbytes/sec] received
あれ?あんま変わってない。。。 ってか実はXSの Mouse ( 最新版 ) 使ったのよねーーー!!!むしろ、Mouse++
ということで最終的には、チューニング前と比べて「137%」速くなりましたよ! 何か突っ込みどころあれば教えてください!
コメントする