君は牛を二頭持っている

渋谷あたりのエンジニアのブログ。OSからウェッブなフロントエンドまでとか色々。

Plackアプリをパフォーマンスチューニングする話

これはPerl Advent Calendar 2014の22日目のために書かれたエントリです。 前日のエントリは @ytnobody さんによる『MeCab? それDockerでできるよ』でした。

このエントリでは、ひどく遅いPlackアプリケーションをシュッと高速化しちゃおうという話のつもりでしたが、なんやらかんやらの事情が働いて時間がなくなったのでシュッとさせるために便利なCPANモジュールの紹介をさせて頂こうと思います。

今回紹介するモジュール

Devel::NYTProf - search.cpan.org

Plack::Middleware::Profiler::NYTProf - search.cpan.org

Plack::Middleware::Debug - search.cpan.org

シュッとさせる前に

「うわっ…私のアプリ、遅すぎ....?」となった時に人が取るべき行動としては、次のようになるかと思います

  1. 全体的にどれぐらい遅いかを見る
  2. 各処理の部分別にパフォーマンスを確認する
  3. 支配的に遅い箇所があればそこから直す

今回話をするモジュールはこの中で、特に2のステップで処理別にパフォーマンスを確認したい時に非常に便利です。コードに手を加えるにもまずは計測しましょう。

Devel::NYTProf

相当あちこちで紹介されつくされたDevel::NYTProfですが、まあ今回のAdventCalendarでは紹介されてないので改めて.

Devel::NYTProfはソースコードの行単位でプロファイリングしてくれるモジュールです。 ごく一部ですが、以下のような情報が記録できます - 呼び出し回数 - 平均スループット(1回の呼び出しあたりの所要時間) - 呼び出し元 このモジュール自体は汎用的なプロファイラなので、Plackアプリ以外でも利用できます。

Plack::Middleware::Profiler::NYTProf

上で紹介したDevel::NYTProfをPlackアプリケーションで使いやすい形にしてくれたものです。 この時点で残り10分のため、詳細は後日改めてリベンジ版で述べさせて頂きますが - PIDごとにレポートが出力される - レポ―トを出力する条件が指定できる などなど便利機能が付いています。

Plack::Midleware::Debug

すみません、あと3分しかないので後日に述べさせて下さい。お願いします。

その他

最近はこんなのもあるよと紹介してもらって、ここで書こうとして全く書けなかったネタ stevan/p5-plack-debugger · GitHub

まとめ

後日、実践版を書きます。 1分後に迫った明日ですが、id:papix さんが、お母上のお誕生日とのことですので何か書いてくださるとのことです。おめでとうございます。