55
ALFC YAPC::Asia 2013 Tokyo 前夜祭 LT-thon Masahiro Nagano @kazeburo

Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Embed Size (px)

DESCRIPTION

Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Citation preview

Page 1: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

ALFCYAPC::Asia 2013 Tokyo前夜祭 LT-thon

Masahiro Nagano @kazeburo

Page 2: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Me• 長野雅広 Masahiro Nagano

• @kazeburo

• PAUSE: KAZEBURO

• Operations Engineer, Site Reliability

• LINE Corp.Development support on LINE Familly, livedoor

Page 3: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

ALFC =

Page 4: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Apache::LogFormat::Compiler

Page 5: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Convert

Page 6: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

‘%h %l %u %t "%r" %>s %b’

Page 7: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

to perl-code

Page 8: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

my $code = <<EOF;sub { my ($env,$res,$length,$reqtime,$time) = @_; $time = time() if ! defined $time; my @lt = localtime($time);; my $t = sprintf '%02d/%s/%04d:%02d:%02d:%02d %s', $lt[3], $abbr[$lt[4]], $lt[5]+1900, $lt[2], $lt[1], $lt[0], $tz; q!! . ($env->{REMOTE_ADDR} || '-') . q! ! . '-' . q! ! . ($env->{REMOTE_USER} || '-') . q! ! . "[" . $t . "]" . q! "! . _safe($env->{REQUEST_METHOD}) . " " . _safe($env->{REQUEST_URI}) . " " . $env->{SERVER_PROTOCOL} . q!" ! . $res->[0] . q! ! . (defined $length ? $length : '-') . q!!}EOF

Page 9: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

and compile

Page 10: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

my $log_line = eval $code;$log_line->($env,$res);

Page 11: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

SYNOPSIS

Page 12: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

my $log_handler = Apache::LogFormat::Compiler->new( '%h %l %u %t "%r" %>s %b');warn $log_handler->log_line($env,$res);

Page 13: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

use Plack::Builder;use Time::HiRes qw/gettimeofday tv_interval/;use Apache::LogFormat::Compiler; my $log_handler = Apache::LogFormat::Compiler->new( '%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i" %D');my $compile_log_app = builder { enable sub { my $app = shift; sub { my $env = shift; my $t0 = [gettimeofday]; my $res = $app->(); my $reqtime = int(tv_interval($t0) * 1_000_000); $env->{psgi.error}->print($log_handler->log_line( $env,$res,6,$reqtime, $t0->[0])); } }; $app};

Page 14: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

OR

Page 15: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Plack::Middleware::AxsLogyet another AccessLog Middleware

Page 16: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

use Plack::Builder; builder { enable 'AxsLog', combined => 1, response_time => 1; $app};

Page 17: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

OR

Page 18: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Plack::Middleware::AccessLogPlack (1.0023~)

Page 19: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Benchmark

Page 20: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

0

10000

20000

30000

40000

50000

60000 51262

8826

Plack-1.0022 Plack-1.0029

Req/Sec

Page 21: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

A����������� ������������������  Story����������� ������������������  of����������� ������������������  ALFC~とある Ops と Dev のおはなし~

Page 22: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

I'm����������� ������������������  tuning����������� ������������������  up����������� ������������������  this����������� ������������������  web����������� ������������������  application.����������� ������������������  NYTProf����������� ������������������  said����������� ������������������  that����������� ������������������  PM::AccessLog����������� ������������������  is����������� ������������������  slow����������� ������������������  

Yes,����������� ������������������  I����������� ������������������  know.����������� ������������������  It's����������� ������������������  slow����������� ������������������  because..����������� ������������������  

Ops Dev

Page 23: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Why PM::AccessLog was slow?

Page 24: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

my %char_handler = ( h => sub { $env->{REMOTE_ADDR} || '-' }, t => sub { "[" . $strftime->('%d/%b/%Y:%H:%M:%S %z', localtime) . "]" }, r => sub { _safe($env->{REQUEST_METHOD}) . " " . _safe($env->{REQUEST_URI}) . " " . $env->{SERVER_PROTOCOL} },);

my $char_handler = sub { my $char = shift; exists $char_handler{$char} ? $char_handler{$char}->($char) : "-";};

$fmt =~ s! (?: \%\{(.+?)\}([a-z]) | \%(?:[<>])?([a-zA-Z\%]) )! $1 ? $block_handler->($1, $2) : $char_handler->($3) !egx;

Page 25: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

I����������� ������������������  can't����������� ������������������  live����������� ������������������  with����������� ������������������  PM::AccessLog!!

I����������� ������������������  have����������� ������������������  idea����������� ������������������  for����������� ������������������  speedup

Ops Dev

Page 26: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Solution: combine strings

Page 27: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

if ( $self->{format} eq 'common' ) { $log_line = _string($env->{REMOTE_ADDR}) . " " . '- ' . _string($env->{REMOTE_USER}) . " " . q![!. $t . q!] ! . _safe(q!"! . $env->{REQUEST_METHOD} . " " . $env->{REQUEST_URI} . " " . $env->{SERVER_PROTOCOL} . q!" !) . $res->[0] . " " . (defined $length ? "$length" : '-');} elsif ( $self->{format} eq 'ltsv' ) { ...}

Page 28: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

This middleware was released as PM::AxsLog

2012-09-12

Page 29: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

This isn’t extensible,only supports

3 formats.common,combined,ltsv

but Fast.

Page 30: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

0

10000

20000

30000

40000

50000

60000 53315

8826

Plack-1.0022 AccessLog AxsLog-0.03

Req/Sec

Page 31: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

2013-03-01

Page 32: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Ah,����������� ������������������  PM::AxsLog����������� ������������������  can't����������� ������������������  modify����������� ������������������  log_format?I����������� ������������������  want����������� ������������������  to����������� ������������������  store����������� ������������������  a����������� ������������������  value����������� ������������������  of����������� ������������������  X-Moe����������� ������������������  to����������� ������������������  logfile

What's?����������� ������������������  PM::AxsLog����������� ������������������  is����������� ������������������  fast����������� ������������������  because����������� ������������������  it����������� ������������������  supports����������� ������������������  only����������� ������������������  fixed����������� ������������������  format.

Ooops,����������� ������������������  I����������� ������������������  should����������� ������������������  return����������� ������������������  to����������� ������������������  use����������� ������������������  PM::AccessLog...

Wait!����������� ������������������  I����������� ������������������  have����������� ������������������  another����������� ������������������  idea����������� ������������������  

Ops Dev

Page 33: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

A few hours later,Ops released

Apache::LogFormat::Compiler(2013-03-01)

Page 34: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

AxsLog changed to use ALFC

Page 35: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

0

11000

22000

33000

44000

550005464053315

AxsLog-0.03 AxsLog-0.12

Req/Sec

Page 36: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

2013-03-19

Page 37: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

@ops����������� ������������������  Can����������� ������������������  I����������� ������������������  replace����������� ������������������  PM::AccessLog����������� ������������������  by����������� ������������������  AxsLog?

I����������� ������������������  recommend����������� ������������������  to����������� ������������������  use����������� ������������������  ALFC����������� ������������������  in����������� ������������������  PM::AccesssLog����������� ������������������  rather����������� ������������������  than����������� ������������������  replace.Because����������� ������������������  option����������� ������������������  of����������� ������������������  AxsLog����������� ������������������  isn’t����������� ������������������  comaptible����������� ������������������  with����������� ������������������  AccessLog

Okay,����������� ������������������  I����������� ������������������  am����������� ������������������  looking����������� ������������������  forward����������� ������������������  to����������� ������������������  pull����������� ������������������  request.

Ops Mr. committer

Page 38: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Plack-1.0023 was released with ALFC.

And Ops removed text "Faster than AccessLog" from PM::AxsLog’s POD

Page 39: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

They lived happily ever after.End

Page 40: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Appendix

Page 41: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Different of AxsLog and AccessLog

Page 42: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

(1)

Page 43: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

AxsLog supports Duration by default.AccessLog doesn’t support it.

AccessLog::Timed required

Page 44: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

use Plack::Builder; builder { enable 'AxsLog', format => ‘%h %l %u %t "%r" %>s %b %D’; $app};

Page 45: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

use Plack::Builder; builder { enable 'AccessLog::Timed', format => ‘%h %l %u %t "%r" %>s %b %D’; $app};

Page 46: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

(2)

Page 47: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

Timing of timestamp

Page 48: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

AxsLog retrieve time() at begining of a request.

AccessLog retrieve time() at end of a request.

Page 49: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

sub call { my ($self,$env) = @_; my $time = time(); #before app my $res = $self->app->($env); $self->log_line($env,$res,$length,$time);}

sub call { my ($self,$env) = @_; my $res = $self->app->($env); my $time = time(); #after app $self->log_line($env,$res,$length,$time);}

PM::AxsLog

PM::AccessLog

Page 50: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

予告

Page 51: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

“PSGI/Plack・Monocerosで学ぶハイパフォーマンス

Webアプリケーションサーバの作り方”

“How to build a High Performance Web Application Server”

YAPC::Asia 2013 TokyoDay#1 11:00~藤原洋記念ホール

Page 52: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

“Inside amon2-livedoor-setup.pl with web application development 2013”

Kazuhiro Yappo Osawa

YAPC::Asia 2013 TokyoDay#1 13:00~多目的教室3

Page 53: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

“本当にあったレガシーな話”

Daisuke Maki @lestrrat

YAPC::Asia 2013 TokyoDay#2 14:10~藤原洋記念ホール

Page 54: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

See����������� ������������������  you����������� ������������������  tomorrow!!明日また来てください。本物のWebAppサーバの高速化を見せてあげますよ

Page 55: Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon

now on sale. go to amazon.co.jp

#"n