2012-01-29
タブでapacheのログを区切る件について
apacheのログをタブで区切ると良い、という話を、nginx + unicornでrails3.1が動作する環境を作る - A Peak Never Ending !のnginxの設定ファイルのログ出力周りを見ていて思い出した。
/etc/nginx/nginx.conf:
(中略)
log_format main '$msec\t'
'$status\t'
'$request_time\t'
'$remote_addr\t'
'$upstream_addr\t'
'$upstream_response_time\t'
'$request\t'
'$http_referer\t'
'$http_user_agent';
その話の記事は以下になります。
404 Blog Not Found:tips - ApacheのLogフォーマットの方を変えて高速化
Benchmark: running rx_naive, rx_optim, tsv for at least 3 CPU seconds... rx_naive: 3 wallclock secs ( 3.15 usr + 0.00 sys = 3.15 CPU) @ 2417.71/s (n=7612) rx_optim: 3 wallclock secs ( 3.78 usr + 0.00 sys = 3.78 CPU) @ 78526.94/s (n=296930) tsv: 4 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 646447.96/s (n=1954495) Rate rx_naive rx_optim tsv rx_naive 2418/s -- -97% -100% rx_optim 78527/s 3148% -- -88% tsv 646448/s 26638% 723% --
タブ区切りをparseすると、実に10倍程度、早い。
#!/usr/local/bin/perl use strict; use warnings; use Benchmark qw/timethese cmpthese/; my $logline = q{localhost.local - - [04/Oct/2007:12:34:56 +0900] "GET /apache_pb.gif HTTP/1.1" 200 2326 "http://www.dan.co.jp/" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"}; my (@logline) = ( $logline =~ m!^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"! ); my $tsv = join "\t", @logline; cmpthese( timethese( 0, { rx_naive => sub { my (@l) = ( $logline =~ m!^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"! ); }, rx_optim => sub { my (@l) = ( $logline =~ m!^([^\s]*) [^\s]* [^\s]* \[([^]]*)\] "([^"]*)" ([^\s]*) [^\s]* "([^"]*)" "([^"]*)"! ); }, tsv => sub { my (@l) = split /\t/, $logline }, } ) );
かなり前にapacheのログを自分で解析するプログラムを書いたときに、とてもお世話になったコードです。
で、実はこのコードには問題があって、
31c31
< tsv => sub { my (@l) = split /\t/, $logline },
---
> tsv => sub { my (@l) = split /\t/, $tsv },
というpatchを当てないと正確な値が出ないのだと思うのです。perlを書いたことがないので正しいのかどうか分からんけれども。
結果はこうなります。
$ ./ben2.pl Benchmark: running rx_naive, rx_optim, tsv for at least 3 CPU seconds... rx_naive: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 4771.25/s (n=14934) rx_optim: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 168081.41/s (n=524414) tsv: 2 wallclock secs ( 3.32 usr + 0.00 sys = 3.32 CPU) @ 278219.28/s (n=923688) Rate rx_naive rx_optim tsv rx_naive 4771/s -- -97% -98% rx_optim 168081/s 3423% -- -40% tsv 278219/s 5731% 66% --
それでも66%増なので、タブ区切りの方が良いのです。前述のnginxの設定ファイルのように、タブ区切りを採用しています。
この件について、twitterでもはてブでも指摘している人は居なかったので、
404 Blog Not Found:コードについて書く方がコードを書くより読まれる現実
読者のほとんどは、コードを読みたくないのだ、ということ。 ざっくり、記事中にコードが一行あるだけで読者は半減する。
ということは、そのとおりなんだろうなぁ、と思いました。
おわり。
トラックバック - http://d.hatena.ne.jp/diffshare/20120129/1327812930
リンク元
- 135 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/diffshare/20110717/1310885571&ei=y247T9biLLCCmQWImsWmCw&usg=AFQjCNEwviM9qQ5F56nVZ3Dm2N7gibOxzg&sig2=apKj0QGvghB_Bx4WF8Yyrw
- 86 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1330999995841&ved=0CDIQFjAB&url=http://d.hatena.ne.jp/diffshare/20091004/1254657578&ei=eHJVT6OOOorlrAf79vTlAw&usg=AFQjCNHWrB_hCL5Fk0KqDm86u6w5aYnL2w
- 63 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cts=1331118283986&ved=0CDYQFjAC&url=http://d.hatena.ne.jp/diffshare/20081220/1229756450&ei=yUBXT9X5Hq7KmQWYwP24Dw&usg=AFQjCNHuuim0qAgKFlyR_4LdaZ98-w1Jhw
- 32 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331267794237&ved=0CD0QFjAD&url=http://d.hatena.ne.jp/diffshare/20100702/1278080740&ei=yIhZT_-JKKi0iQev1cSpDQ&usg=AFQjCNEPLZAiCL4XuBGXz8AAHyKiVLtvtA
- 29 http://www.google.co.jp/url?sa=t&rct=j&q=rails sns&source=web&cd=1&ved=0CCMQFjAA&url=http://d.hatena.ne.jp/diffshare/20090320/1237521395&ei=0GUlT9WMFM2TiQf257WLBA&usg=AFQjCNE7CEpfWULD0RBg7_gxzpCtK_fn3Q
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=netcommons 動画をアップロードしています&source=web&cd=1&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/diffshare%
- 19 https://www.google.co.jp/
- 16 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CFkQFjAE&url=http://d.hatena.ne.jp/diffshare/20081220/1229756450&ei=zpdhT7iKLaXqmAWCkoysCA&usg=AFQjCNHuuim0qAgKFlyR_4LdaZ98-w1Jhw
- 14 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=2&cts=1331345753578&ved=0CEAQFjAB&url=http://d.hatena.ne.jp/diffshare/20080927&ei=SrlaT5OpPI6WmQWrmthI&usg=AFQjCNG_cDvTMTR-A-NTYPEBxEsEv5uiPQ&sig2=jUgGyowzdo-0Q9KFmeP0sw
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=ruby on rails sns&source=web&cd=1&ved=0CDsQFjAA&url=http://d.hatena.ne.jp/diffshare/20090320/1237521395&ei=kDcmT4z7JYSJmQW4uqmuDA&usg=AFQjCNE7CEpfWULD0RBg7_gxzpCtK_fn3Q&sig2=uq8NKCz21SxQKTvQOaqcmg