新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2011-01-07

[Perl]Memcached::Serverで作ったニートサーバのベンチマークをとってみた

CPANにMemcached::Serverというモジュールがあるんですが、これを使うと、PerlだけでMemcachedプロトコルに対応したオレオレサーバが作れるんです。
で、このモジュールのサンプルでもあるMemcached::Server::Defaultのドキュメントに、
It works like a normal Memcached server, but not good at efficiency as the real one.
なあんて書いてあるので、
「じゃあMemcached::Serverで作ったニート(=仕事をしない)なサーバなら、どのくらいのパフォーマンスが出るのよ?」
という疑問を抱いてしまい、実際にニートサーバをでっち上げて、本家memcachedとのパフォーマンス比較をしてみました。

ニートサーバのソース

「働いたら負けかなと思っている」(AA略)
use warnings;
use strict;
use AnyEvent;
use Memcached::Server;
my $server = Memcached::Server->new(
    no_extra => 1,
    cmd => {
        set => sub { shift->(1) },
        get => sub { shift->(0) },
        delete => sub { shift->(1) },
        flush_all => sub { shift->() },
    },
    open => [ [ 0, 11222 ] ],
);

AE::cv->recv;

ベンチマークコード

普段あまりベンチマークコード書かない子なのがバレバレですね。。。><
use warnings;
use strict;
use Benchmark qw( :all );

use Cache::Memcached::Fast;

my $origin_if = Cache::Memcached::Fast->new( { servers => [ qw/ 127.0.0.1:11211 /] } );
my $mine_if = Cache::Memcached::Fast->new( { servers => [ qw/ 127.0.0.1:11222 /] } );

my @patterns = (
    { method => 'set', params => [ 'hoge', 123 ] },
    { method => 'get', params => [ 'hoge' ] },
    { method => 'delete', params => [ 'hoge' ] },
);

for my $pattern ( @patterns ) {
    my $method = $pattern->{ method };
    warn "------ $method ------\n";
    my $r = timethese( 100000, {
        origin => sub { $origin_if->$method( @{ $pattern->{ param } } ) },
        mine => sub { $mine_if->$method( @{ $pattern->{ param } } ) },
    } );
    cmpthese $r;
}

ベンチ結果

ニートサーバと本家サーバを起動し、ベンチマークコードを実行した結果、興味深い結果に。。。
------ set ------
Benchmark: timing 100000 iterations of mine, origin...
      mine: 27 wallclock secs ( 1.79 usr +  3.15 sys =  4.94 CPU) @ 20242.91/s (n=100000)
    origin:  8 wallclock secs ( 1.43 usr +  3.03 sys =  4.46 CPU) @ 22421.52/s (n=100000)
          Rate   mine origin
mine   20243/s     --   -10%
origin 22422/s    11%     --
------ get ------
Benchmark: timing 100000 iterations of mine, origin...
      mine: 20 wallclock secs ( 1.25 usr +  3.17 sys =  4.42 CPU) @ 22624.43/s (n=100000)
    origin:  7 wallclock secs ( 1.21 usr +  3.11 sys =  4.32 CPU) @ 23148.15/s (n=100000)
          Rate   mine origin
mine   22624/s     --    -2%
origin 23148/s     2%     --
------ delete ------
Benchmark: timing 100000 iterations of mine, origin...
      mine: 19 wallclock secs ( 1.64 usr +  3.25 sys =  4.89 CPU) @ 20449.90/s (n=100000)
    origin: 15 wallclock secs ( 2.94 usr +  6.05 sys =  8.99 CPU) @ 11123.47/s (n=100000)
          Rate origin   mine
origin 11123/s     --   -46%
mine   20450/s    84%     --
おおおお!なんと!setとgetでは本家サーバに負けたものの、deleteではニートサーバがブッちぎりで勝利してます!!!
まあニートなので、Memcached::ServerとAE以外は何も仕事していないのですけど。。。
getにしても、2%の差に留まっているのは、まずまず悪くない結果です。
あとはsetがもう少し速ければ、安定性と載せるロジック次第で結構面白いものになるのではないでしょうか。

0 件のコメント: