created: 2023-10-26T06:17:21.908Z

Perl 製の Web アプリに NYTProf を仕込む

アプリの処理が遅くて困ってる場合に、まず遅い処理を確定させるためにプロファイルをとる。perl だと NYTProf というのがあってこれがよくつかわれるのでこれを使う。

準備

コマンドラインから問題になってる処理を何回も実行できるように、Chrome で問題になっている処理があるページへのリクエストを copy as curl でコマンドラインから実行できるようにしておく。

$ pbpaste > /tmp/_copy_as_curl.sh

プロファイルを仕込む

スクリプトだと起動オプションに -d:NYTProf とつければいいだけだが、Web アプリの場合はそれをやるとアプリの起動から目的のページへの遷移などすべての処理でプロファイルが取られてしまう。DB::enable_profile を使えば任意の区間でプロファイルがとれるので、エンドポイントの最初と最後にこれを仕掛ける。

use Devel::NYTProf;

sub edit {
      DB::enable_profile('/tmp/nytprof.out');
      ...なんか処理
      DB::disable_profile();
}

計測する

高速化する実装を入れて、Plack を再起動させてプロファイラが入ってる状態で処理を通す。 DB::enable_profile を使っている場合は起動オプションをつける必要はない。Web 開発の場合はファイルを変更したら再起動されると思うのでその再起動でよい。

touch ./lib/Web.pm
source /tmp/_copy_as_curl.sh

閲覧する

そのあとで、プロファイラを外してまた Plack のプロセスを再起動させると DB::enable_profile にプロファイル結果が最後まで書き込まれるので、これをもってきてブラウザで確認する。

$ docker compose exec app carton exec nytprofhtml -f /tmp/nytprof.out -o /tmp/nytprof_report
$ docker compose cp app:/tmp/nytprof_report /tmp/
$ python3 -m http.server --bind 127.0.0.1 --directory /tmp/nytprof_report

参考

ホワイトハッカーの教科書
[ad] ホワイトハッカーの教科書
IPUSIRON (単行本(ソフトカバー))