ISUCON用にNYTProf+Prefork PSGI serverのベストプラクティスをコマンドにまとめた

これが価値を発揮するような出題ではなかったので結局つかいませんでしたが。あとでCPANizeはするつもりです。

てきとうなところで ^C でとめると結果を自動的に集計してreportをつくるところまでやってくれます。あくまでも開発用で、本番用ではありません。

なおこれを使う場合、アプリ側で DB::enable_profile() / DB::disable_profile() を行う必要があります。tokuhiromのエントリも参照のこと。

#!/usr/bin/env perl
# usage: plackup-nytprof --port 1982 app.psgi
use 5.10.0;
use strict;
use warnings;
use Cwd qw(getcwd);
use File::Path qw(rmtree);

sub run {
    my(@args) = @_;

    say "@args";
    system(@args) == 0 or die "Failed to run plackup(1)";
}

my $dir = sprintf('%s/tmp', getcwd());

mkdir $dir;

$ENV{NYTPROF} = join ':',
    # 'clock=N',
    'sigexit=int',
    'start=no',
    'addpid=1',
    'forkdepth=0',
    "file=$dir/nytprof.out",
;
run($^X, '-S', '-d:NYTProf', 'plackup',
    qw(-s Starlet),
    @ARGV);

END {
    run('nytprofmerge', '--out',"$dir/nytprof-merged.out", glob("$dir/nytprof.out.*"));
    run('nytprofhtml', '--minimal', '--delete', '--file', "$dir/nytprof-merged.out");
    rmtree $dir if -d $dir;
}

参考文献: