Plack-1.0023 から Plack::Middleware::AccessLog が Apache::LogFormat::Compiler を使うようになって、アクセスログの出力が速くなりました。
これまでの PM::AccessLog はリクエストの度に ログフォーマットの文字列を正規表現でパース、必要なメソッドを呼び出してアクセスログを生成していましたが、ALFCは初期化フェーズで ログフォーマットの文字列を1つのperlのコードに変換してしまうので、低コストでログを生成することができます。
以下ベンチマーク結果。アクセスログを有効にしただけのHello Worldだと、1.5倍くらい早くなる模様。memcachedに数回リクエストを送るだけのアプリケーションならプロダクション環境でも効果があるんじゃないでしょうか。ちなみにサーバを介さないベンチマークだと6倍ぐらい高速になってました
Benchmarks
HelloWorld.psgi
use Plack::Builder;
builder {
enable 'AccessLog', logger => sub { };
sub { [200, ['Content-Type'=>'text/plain','Content-Length'=>11],['Hello World']] }
};
Setup
Plack-1.0022
$ cat cpanfile
requires 'Plack', '== 1.0022';
requires 'Starlet';
requires 'HTTP::Parser::XS';
$ carton install
$ carton exec -- -- plackup -s Starlet -E production --max-workers=10 --max-reqs-per-child=10000 -a HelloWorld.psgi
Plack-1.0023
$ cat cpanfile
requires 'Plack', '== 1.0023';
requires 'Starlet';
requires 'HTTP::Parser::XS';
$ carton install
$ carton exec -- -- plackup -s Starlet -E production --max-workers=10 --max-reqs-per-child=10000 -a HelloWorld.psgi
ApacheBench Options
$ ab -c 8 -n 50000 http://localhost:5000/
Result
Plack-1.0022
Concurrency Level: 8
Time taken for tests: 4.201 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 7300146 bytes
HTML transferred: 550011 bytes
Requests per second: 11900.85 [#/sec] (mean)
Time per request: 0.672 [ms] (mean)
Time per request: 0.084 [ms] (mean, across all concurrent requests)
Transfer rate: 1696.84 [Kbytes/sec] received
Plack-1.0023
Concurrency Level: 8
Time taken for tests: 2.864 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 7300146 bytes
HTML transferred: 550011 bytes
Requests per second: 17460.12 [#/sec] (mean)
Time per request: 0.458 [ms] (mean)
Time per request: 0.057 [ms] (mean, across all concurrent requests)
Transfer rate: 2489.48 [Kbytes/sec] received
これが出た事でAxsLogに「高速」というアドバンテージがなくなった。PODを書き直さないと!