Adding a couple benchmark scripts
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
parent
8f4224c46f
commit
d4bde52e7a
|
|
@ -1,18 +1,47 @@
|
|||
#!/usr/bin/perl
|
||||
# This is an example script for how to benchmark various
|
||||
# parts of your Koha system. It's useful for measuring the
|
||||
# impact of mod_perl on performance.
|
||||
# This script implements a basic benchmarking and regression testing
|
||||
# utility for Koha
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
BEGIN {
|
||||
# find Koha's Perl modules
|
||||
# test carefully before changing this
|
||||
use FindBin;
|
||||
eval { require "$FindBin::Bin/kohalib.pl" };
|
||||
}
|
||||
|
||||
use HTTPD::Bench::ApacheBench;
|
||||
use LWP::UserAgent;
|
||||
use Data::Dumper;
|
||||
use HTTP::Cookies;
|
||||
use C4::Context;
|
||||
|
||||
# 1st, find some max values
|
||||
my $baseurl= C4::Context->preference("staffClientBaseURL")."/cgi-bin/koha/";
|
||||
my $max_tries = 200;
|
||||
my $concurrency = 10;
|
||||
my $debug;
|
||||
my $user = 'kados';
|
||||
my $password = 'kados';
|
||||
|
||||
# Authenticate via our handy dandy RESTful services
|
||||
# and grab a cookie
|
||||
my $ua = LWP::UserAgent->new();
|
||||
my $cookie_jar = HTTP::Cookies->new();
|
||||
my $cookie;
|
||||
$ua->cookie_jar($cookie_jar);
|
||||
my $resp = $ua->post( "$baseurl"."/svc/authentication" , {userid =>$user, password => $password} );
|
||||
if( $resp->is_success ) {
|
||||
$cookie_jar->extract_cookies( $resp );
|
||||
$cookie = $cookie_jar->as_string;
|
||||
print "Authentication successful\n";
|
||||
print "Auth:\n $resp->content" if $debug;
|
||||
}
|
||||
# remove some unnecessary garbage from the cookie
|
||||
$cookie =~ s/ path_spec; discard; version=0//;
|
||||
$cookie =~ s/Set-Cookie3: //;
|
||||
|
||||
# Get some data to work with
|
||||
my $dbh=C4::Context->dbh();
|
||||
my $sth = $dbh->prepare("select max(borrowernumber) from borrowers");
|
||||
$sth->execute;
|
||||
|
|
@ -26,10 +55,6 @@ $sth = $dbh->prepare("select max(itemnumber) from items");
|
|||
$sth->execute;
|
||||
my ($itemnumber_max) = $sth->fetchrow;
|
||||
|
||||
my $baseurl= C4::Context->preference("staffClientBaseURL")."/cgi-bin/koha/";
|
||||
my $max_tries = 200;
|
||||
my $concurrency = 5;
|
||||
|
||||
$|=1;
|
||||
#
|
||||
# the global benchmark we do at the end...
|
||||
|
|
@ -44,15 +69,16 @@ $b0->concurrency( $concurrency );
|
|||
|
||||
my @mainpage;
|
||||
print "--------------\n";
|
||||
print "Koha benchmark\n";
|
||||
print "Koha circulation benchmarking utility\n";
|
||||
print "--------------\n";
|
||||
print "benchmarking with $max_tries occurences of each operation\n";
|
||||
print "mainpage (low RDBMS dependency) ";
|
||||
print "Benchmarking with $max_tries occurences of each operation and $concurrency concurrent sessions \n";
|
||||
print "Load testing staff client dashboard page";
|
||||
for (my $i=1;$i<=$max_tries;$i++) {
|
||||
push @mainpage,"$baseurl/mainpage.pl";
|
||||
}
|
||||
my $run0 = HTTPD::Bench::ApacheBench::Run->new
|
||||
({ urls => \@mainpage,
|
||||
cookies => [$cookie],
|
||||
});
|
||||
$b0->add_run($run0);
|
||||
$b->add_run($run0);
|
||||
|
|
@ -70,10 +96,10 @@ my $b1 = HTTPD::Bench::ApacheBench->new;
|
|||
$b1->concurrency( $concurrency );
|
||||
|
||||
my @biblios;
|
||||
print "biblio (MARC detail)";
|
||||
print "Load testing catalog detail page";
|
||||
for (my $i=1;$i<=$max_tries;$i++) {
|
||||
my $rand_biblionumber = int(rand($biblionumber_max)+1);
|
||||
push @biblios,"$baseurl/catalogue/MARCdetail.pl?biblionumber=$rand_biblionumber";
|
||||
push @biblios,"$baseurl/catalogue/detail.pl?biblionumber=$rand_biblionumber";
|
||||
}
|
||||
my $run1 = HTTPD::Bench::ApacheBench::Run->new
|
||||
({ urls => \@biblios,
|
||||
|
|
@ -94,7 +120,7 @@ my $b2 = HTTPD::Bench::ApacheBench->new;
|
|||
$b2->concurrency( $concurrency );
|
||||
|
||||
my @borrowers;
|
||||
print "borrower detail ";
|
||||
print "Load testing patron detail page";
|
||||
for (my $i=1;$i<=$max_tries;$i++) {
|
||||
my $rand_borrowernumber = int(rand($borrowernumber_max)+1);
|
||||
# print "$baseurl/members/moremember.pl?borrowernumber=$rand_borrowernumber\n";
|
||||
|
|
@ -102,6 +128,7 @@ for (my $i=1;$i<=$max_tries;$i++) {
|
|||
}
|
||||
my $run2 = HTTPD::Bench::ApacheBench::Run->new
|
||||
({ urls => \@borrowers,
|
||||
cookies => [$cookie],
|
||||
});
|
||||
$b2->add_run($run2);
|
||||
$b->add_run($run2);
|
||||
|
|
@ -122,7 +149,7 @@ $b4->concurrency( $concurrency );
|
|||
|
||||
my @issues;
|
||||
my @returns;
|
||||
print "Issues detail ";
|
||||
print "Load testing circulation transaction (checkouts)";
|
||||
$sth = $dbh->prepare("SELECT barcode FROM items WHERE itemnumber=?");
|
||||
my $sth2 = $dbh->prepare("SELECT borrowernumber FROM borrowers WHERE borrowernumber=?");
|
||||
for (my $i=1;$i<=$max_tries;$i++) {
|
||||
|
|
@ -139,13 +166,14 @@ for (my $i=1;$i<=$max_tries;$i++) {
|
|||
my $rand_itemnumber = int(rand($itemnumber_max)+1);
|
||||
$sth->execute($rand_itemnumber);
|
||||
($rand_barcode) = $sth->fetchrow();
|
||||
# print "$baseurl/circ/circulation.pl?borrowernumber=$rand_borrowernumber&barcode=$rand_barcode&issueconfirmed=1&year=2010&month=01&day=01\n";
|
||||
}
|
||||
print "borrowernumber=$rand_borrowernumber&barcode=$rand_barcode\n";
|
||||
push @issues,"$baseurl/circ/circulation.pl?borrowernumber=$rand_borrowernumber&barcode=$rand_barcode&issueconfirmed=1";
|
||||
push @returns,"$baseurl/circ/returns.pl?barcode=$rand_barcode";
|
||||
}
|
||||
my $run3 = HTTPD::Bench::ApacheBench::Run->new
|
||||
({ urls => \@issues,
|
||||
cookies => [$cookie],
|
||||
});
|
||||
$b3->add_run($run3);
|
||||
$b->add_run($run3);
|
||||
|
|
@ -153,11 +181,12 @@ $b->add_run($run3);
|
|||
# send HTTP request sequences to server and time responses
|
||||
$ro = $b3->execute;
|
||||
# calculate hits/sec
|
||||
print ("\t".$b3->total_time."ms\t".(1000*$b3->total_requests/$b3->total_time)." issues/sec\n");
|
||||
print ("\t".$b3->total_time."ms\t".(1000*$b3->total_requests/$b3->total_time)." checkouts/sec\n");
|
||||
|
||||
print "Returns detail ";
|
||||
print "Load testing circulation transaction (checkins)";
|
||||
my $run4 = HTTPD::Bench::ApacheBench::Run->new
|
||||
({ urls => \@returns,
|
||||
cookies => [$cookie],
|
||||
});
|
||||
$b4->add_run($run4);
|
||||
$b->add_run($run4);
|
||||
|
|
@ -165,8 +194,8 @@ $b->add_run($run4);
|
|||
# send HTTP request sequences to server and time responses
|
||||
$ro = $b4->execute;
|
||||
# calculate hits/sec
|
||||
print ("\t".$b4->total_time."ms\t".(1000*$b4->total_requests/$b4->total_time)." returns/sec\n");
|
||||
print ("\t".$b4->total_time."ms\t".(1000*$b4->total_requests/$b4->total_time)." checkins/sec\n");
|
||||
|
||||
print "Benchmarking everything";
|
||||
print "Load testing all transactions at once";
|
||||
$ro = $b->execute;
|
||||
print ("\t".$b->total_time."ms\t".(1000*$b->total_requests/$b->total_time)." operations/sec\n");
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
#!/usr/bin/perl
|
||||
use strict;
|
||||
use warnings;
|
||||
#Usage:
|
||||
# perl testKohaWS.pl http://eowyn.metavore.com:8001/cgi-bin/koha/svc cfc cfc 0.5 5 records/xml/xml-recs.xml
|
||||
#
|
||||
# POSTs to baseurl x number of times with y secs of delay between POSTs
|
||||
#
|
||||
# args:
|
||||
# http://eowyn.metavore.com:8001/cgi-bin/koha/svc = baseurl
|
||||
# 1st cfc = userid
|
||||
# 2nd cfc = pw
|
||||
# 0.5 = sleep(0.5) between POSTs
|
||||
# 5 = number of times to poast
|
||||
# records/xml/xml-recs.xml = file of 1 marcxml record to post
|
||||
#
|
||||
# Requires LWP::UserAgent, File::Slurp.
|
||||
use LWP::UserAgent;
|
||||
use File::Slurp qw(slurp);
|
||||
use Carp;
|
||||
my $ua = LWP::UserAgent->new();
|
||||
$ua->cookie_jar({ file =>"cookies.txt" });
|
||||
my $baseurl = shift;
|
||||
my $userid = shift;
|
||||
my $password = shift;
|
||||
my $timeout = shift;
|
||||
my $timestopost = shift;
|
||||
my $xmlfile = shift;
|
||||
|
||||
my $xmldoc = slurp($xmlfile) or die $!;
|
||||
# auth
|
||||
my $resp = $ua->post( $baseurl . '/authentication' , {userid =>$userid, password => $password} );
|
||||
if( $resp->is_success ) {
|
||||
print "Auth:\n";
|
||||
print $resp->content;
|
||||
}
|
||||
else {
|
||||
die $resp->status_line;
|
||||
}
|
||||
|
||||
for( my $i = 0; $i < $timestopost; $i++) {
|
||||
warn "posting a bib number $i\n";
|
||||
#warn "xmldoc to post: $xmldoc\n";
|
||||
my $resp = $ua->post( $baseurl . '/new_bib' , 'Content-type' => 'text/xml', Content => $xmldoc );
|
||||
if( $resp->is_success ) {
|
||||
print "post to new_bib response:\n";
|
||||
print $resp->content;
|
||||
}
|
||||
else {
|
||||
die $resp->status_line;
|
||||
}
|
||||
sleep($timeout);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue