The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

plackbench - Benchmarking/Debugging tool for Plack web requests

SYNOPSIS

    # Make a request 5 times, and print some stats
    $ plackbench -n 5 /path/to/app.psgi '/search?q=stuff'

    # Debug the same request
    $ PERL5OPT=-d plackbench -n 5 /path/to/app.psgi '/search?q=stuff'

    # Profile the same request
    $ PERL5OPT=-d:NYTProf plackbench -n 5 /path/to/app.psgi '/search?q=stuff'
    $ nytprofhtml -m

DESCRIPTION

This script benchmarks a web request. It hits the Plack app directly without going through a web server.

This is somewhat useful on it's own for getting an idea of the time spent in Perl-land for a web request. But it's mostly a harness for a debugger or profiler.

USAGE

  plackbench /path/to/app.psgi URI

The first positional argument is the path to a .psgi file. The second is the URL to request.

The URI is relative to the application root.

OPTIONS

-n

Number of times to execute the request. Defaults to 1.

--warm

Make an initial request that won't be included in the stats.

--post=<file>

Make a POST request instead of a GET. Pass the path to a file with the raw URL-encoded POST data. If the file contains multiple lines, each will be used a separate POST request.

If the file is a '-', the POST body will be read from STDIN.

-e <code>

Pre-process the request using the Perl code passed. $_ will be set to a HTTP::Request object.

For example, to set the User-Agent:

    plackbench -e '$_->header("User-Agent" => "Mozilla")' /path/to/app.psgi /
-f <file>

Like -e, however the code is read from a file. Should return a code reference, which will be passed a HTTP::Request object.

A simple example:

    sub {
        my $request = shift;
        $request->header( Cookie => 'session=mysid' );
        return;
    }

The file can contain any valid Perl code, but the last statement in the file must be a subroutine reference.

Using with Devel::NYTProf

Just invoking the script through NYTProf is all that's necessary:

    PERL5OPT=-d:NYTProf plackbench /path/to/app.psgi '/search?q=stuff'

In some applications, startup costs can overshadow the actual request in the report. If this happens prevent NYTProf from starting by default:

    NYTPROF=start=no PERL5OPT=-d:NYTPRof plackbench /path/to/app.psgi '/search?q=stuff'

The script will call DB::enable_profile() to start NYTProf before executing any requests. Which removes the startup code from the final report.

If the --warm flag is used, DB::enable_profile() will be called after the initial request.

See Devel::NYTProf for more information.

AUTHOR

Paul Boyd <boyd.paul2@gmail.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Paul Boyd.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.