改善、確認のためのベンチマーク
特定できたボトルネックに対して修正した結果、
Benchmark.pm
Benchmark.
リスト9はDateTimeのインスタンス生成時に、
use Benchmark qw/:all/;
use DateTime;
use DateTime::TimeZone;
my $name = "Asia/Tokyo";
my $tz = DateTime::TimeZone->new( name => $name );
my $results = timethese( 0, {
obj_tz => sub { DateTime->now( time_zone => $tz ) },
str_tz => sub { DateTime->now( time_zone => $name ) },
});
cmpthese($results);
Benchmark: running obj_tz, str_tz for at least 3 CPU seconds... obj_tz: 3 wallclock secs ( 3.21 usr + 0.01 sys = 3.22 CPU) @ 3286.34/s (n=10582) str_tz: 3 wallclock secs ( 3.22 usr + 0.01 sys = 3.23 CPU) @ 2667.49/s (n=8616) Rate str_tz obj_tz str_tz 2667/s -- -19% obj_tz 3286/s 23% --
Benchmark.
実質的な速度差を考える
計測した結果、
一度のリクエストで1回しか呼ばれない処理について、
しかしその処理が一度のリクエストで1,000回呼ばれるのであれば、
Parallel::Benchmarkでの並列処理ベンチマーク
Benchmark.
本番環境同様の複数プロセスが動作する状態で、
Cache::Memcached::Fastでmemcachedにアクセスを行う場合のベンチマークコードはリスト10のようになります
use Parallel::Benchmark;
use Cache::Memcached::Fast;
my $bm = Parallel::Benchmark->new(
setup => sub {
my ($self) = @_;
$self->stash->{cache}
= Cache::Memcached::Fast->new({
servers => ["127.0.0.1:11211"],
});
},
benchmark => sub {
my ($self, $id) = @_;
$self->stash->{cache}->get("foo");
return 1; # score
},
teardown => sub {
my ($self) = @_;
delete $self->stash->{cache};
},
concurrency => 10,
time => 3,
);
my $result = $bm->run;
2012-08-19T13:59:06 [INFO] starting benchmark: concurrency: 10, time: 3 2012-08-19T13:59:11 [INFO] done benchmark: score 67980, elapsed 3.014 sec = 22552.610 / sec
Parallel::Benchmarkはconcurrency
の数だけ子プロセスをforkし、setup
が完了するまで待ちます。そのあと、benchmark
で指定されたコードを実行し、time
で指定した秒数後にteardown
を処理、
ベンチマーク結果のスコアは、benchmark
で返した数値を合算したものを、
シグナルとParallel::Scoreboardを利用して子プロセスの制御を行うため、
Parallel::BenchmarkとFurlを使った負荷テストツール
Parallel::Benchmarkは子プロセスを複数起動して並列処理を行うため、
10プロセスを立ち上げ、
use Parallel::Benchmark;
use Furl;
my $bm = Parallel::Benchmark->new(
setup => sub {
my ($self) = @_;
$self->stash->{ua} = Furl->new;
},
benchmark => sub {
my ($self, $id) = @_;
my $ua = $self->stash->{ua};
my $sub_score = 0;
if ($id == 1) {
my $res = $ua->post(
"http://example.com/comment",
[], [ comment => "foo" ]
);
$sub_score++ if $res->is_success;
}
else {
for my $path (qw/ list board1 board2 /) {
my $res = $ua->get("http://example.com/$path");
$sub_score++ if $res->is_success;
}
}
return $sub_score;
},
teardown => sub {
my ($self) = @_;
delete $self->stash->{ua};
},
concurrency => 10,
time => 60,
);
$bm->run;
benchmark
に与えるサブルーチンリファレンスの第2引数には、
HTTPのベンチマークツールとしては、
負荷テストの重要性
ソーシャルゲームなど、
CPU負荷、
まとめ
一口にパフォーマンスチューニングと言っても、
繰り返して強調したいことは、
さて、