2013年7月アーカイブ

WEB+DB PRESSで連載されているPerl Hackers Hubの記事を最新にアップデート + Yappoさんとnaoyaさんの書き下ろし記事 + 弾さんのインタビュー記事をまとめた、Web開発者必携の一冊となっております。

IMG_1349.jpg

WEB+DB PRESS Vol.65に書いたログの話も少し修正して、当時まだリリースされてなかったFile::RotateLogsの紹介などもしました。ぜひ手に取って読んでくださいませ!

Perl徹底攻略 (WEB+DB PRESS plus)
大沢 和宏 cho45(さとう) 小林 篤 和田 裕介 嶋田 裕二(xaicron) 牧 大輔(lestrrat) 奥 一穂 広木 大地 伊藤 直也 長野 雅広 藤原 俊一郎 伊藤 智章 まかまか般若波羅蜜 小飼 弾 近藤 嘉雪 中川 勝樹 宮川 達彦 tokuhirom 藤 吾郎(gfx) 村瀬 大輔
技術評論社
売り上げランキング: 615

同時に「Web開発の基礎徹底攻略」という本も出ます。こちらもオススメ!

Web開発の基礎徹底攻略 (WEB+DB PRESS plus)
小飼 弾 田籠 聡 近藤 宇智朗 並河 祐貴 赤松 祐希 井上 誠一郎 ミック 天尋 左石 和田 裕介
技術評論社
売り上げランキング: 533

I released Plack::Middleware::Deflater version 0.10.

cpan: https://metacpan.org/release/Plack-Middleware-Deflater
github: https://github.com/miyagawa/Plack-Middleware-Deflater

In version 0.10. I replaced IO::Compress::(Gzip|Deflate) with new encoder implementation PM::Deflater::Encoder.

IO::Compress::(Gzip|Deflate)->new is bit slowly. PM::Deflater::Encoder use Compresss::Zlib directory. Throughput will be better from 10% to 100% by content size.

Here is screenshots of nytprof flame graph

version 0.09

deflater009.png

version 0.10

deflater010.png

Benchmarks

run Starlet server that delivers a html

carton exec -- plackup -s Starlet --max-workers=15  -E production 
  -e 'open(my $fh,"sample.html");
      local $/;my $body = <$fh>;
      enable Deflater;
      sub {[200,["Content-Type"=>"text/html"],[$body]]} '

an benchmark with ab command from another host

case#1 168Byte html

## not compress
$ ab -c 15 -n 10000 'http://10.x.x.x:5000/'
Document Length:        168 bytes
Requests per second:    19375.30 [#/sec] (mean)
Time per request:       0.774 [ms] (mean)

## enable gzip PM::Deflater 0.09
$ ab -c 15 -n 10000 -H 'Accept-Encoding: gzip,deflate' 'http://10.x.x.x:5000/'
Document Length:        139 bytes
Requests per second:    8765.65 [#/sec] (mean)
Time per request:       1.711 [ms] (mean)

## enable gzip PM::Deflater 0.10
$ ab -c 15 -n 10000 -H 'Accept-Encoding: gzip,deflate' 'http://10.x.x.x:5000/'
Document Length:        139 bytes
Requests per second:    12656.63 [#/sec] (mean)
Time per request:       1.185 [ms] (mean)

case#2 14KB html

## not compress
$ ab -c 15 -n 10000 'http://10.x.x.x:5000/'
Document Length:        13974 bytes
Requests per second:    7972.88 [#/sec] (mean)
Time per request:       1.881 [ms] (mean)
# ≒ 1Gbps

## enable gzip PM::Deflater 0.09
$ ab -c 15 -n 10000 -H 'Accept-Encoding: gzip,deflate' 'http://10.x.x.x:5000/'
Document Length:        4350 bytes
Requests per second:    5851.74 [#/sec] (mean)
Time per request:       2.563 [ms] (mean)

## enable gzip PM::Deflater 0.10
$ ab -c 15 -n 10000 -H 'Accept-Encoding: gzip,deflate' 'http://10.x.x.x:5000/'
Document Length:        4350 bytes
Requests per second:    7580.95 [#/sec] (mean)
Time per request:       1.979 [ms] (mean)

Plack::Middleware::Deflaterの0.10をリリースしました。IO::Compress::(Gzip|Deflate)が遅いなと思うところがあったので、 Compresss::Zlibを直接使って圧縮を行うEncoderを実装し直しました。コンテンツサイズによって10%〜100%ぐらい速くなります

Cache::Memcached(::Fast) のオプションには namespace というのがあります。

https://metacpan.org/module/Cache::Memcached::Fast
https://metacpan.org/module/Cache::Memcached

Cache::Memcached、Cache::Memcached::Fast、どちらもnamespaceはインスタンス作成時に指定して、あとから変更することは出来ません。

my $s = Cache::Memcached::Fast->new({
    servers => [qw/127.0.0.1:11211/],
    namespace => 'myservice'
});

namespaceを使うと、ひとつのmemcachedサーバを複数のアプリケーションから使用する場合などに、それぞれ別のネームスペースを指定しておく事でキャッシュのキーが被らないようにできます。

このnamespaceですが、キャッシュキーとの連結は

$key = "$prefix$key";

という感じで間に何も入りません。なのでハッシュ値なキャッシュキーと組み合わせると

myservicee2fc714c4727ee9395f324cd2e7f331f

となり、どこからどこまでがprefixなのか解らなくなります。アプリケーションからは全く問題ないのですが、pt-query-digest(2.1系、2.2以降はmemcachedプロトコルは扱わなくなった)などで見た時にアレ?っとなり易いです。

参考: 僕らがmemcachedのキャッシュキーにsha1やmd5のhash値を使うを避ける理由

ですので、

my $s = Cache::Memcached::Fast->new({
    servers => [qw/127.0.0.1:11211/],
    namespace => 'myservice|'
});

のように何か区切りとなる文字で終わっているとよろしいかと思います。

ところで、新し目のmemcachedには起動オプションに -D というのがあります。

-D <char>    Use <char> as the delimiter between key prefixes and IDs.
             This is used for per-prefix stats reporting. The default is
             ":" (colon). If this option is specified, stats collection
             is turned on automatically; if not, then it may be turned on
             by sending the "stats detail on" command to the server.

これを使うと、prefix毎の統計情報を出力することができます。

$ /path/to/memcached -D '|' -vv

このように起動して、namespaceを変えながら何度かアクセスしてみます。

for my $namespace ( 1..10 ) {
    my $s = Cache::Memcached::Fast->new({
        servers => [qw/127.0.0.1:11211/],
        namespace => sprintf('p%03d|',$namespace)
    });
    for my $key ( 1..100 ) {
        $s->set($key,'xxx');
        $s->get($key,'xxx');
    }
}

そうして、telnetを使って統計情報を出します。

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats detail dump
PREFIX p005 get 100 hit 100 set 100 del 0
PREFIX p001 get 100 hit 100 set 100 del 0
PREFIX p006 get 100 hit 100 set 100 del 0
PREFIX p010 get 100 hit 100 set 100 del 0
PREFIX p009 get 100 hit 100 set 100 del 0
PREFIX p008 get 100 hit 100 set 100 del 0
PREFIX p002 get 100 hit 100 set 100 del 0
PREFIX p004 get 100 hit 100 set 100 del 0
PREFIX p007 get 100 hit 100 set 100 del 0
PREFIX p003 get 100 hit 100 set 100 del 0
END

prefix(namespace)毎に簡単な統計がでてきました。

-D オプションのデフォルトは「:」になっていますが、-D が指定されていない場合、統計がでません。その場合は「stats detail on」コマンドを実行する必要があるようです。