分析全站应用的响应时间

因为流量镜像分析的功能还没有做好,目前要统计全站的应用的响应时间就比较麻烦。我直接把做代理的nginx的日志都拷贝出来,然后跑脚本。
由于日志是压缩过的,本来直接perl里面可以使用cpan里的一个gunzip的模块,但是测试后发现性能实在烂的不行,连gunzip速度的1/4都不到。后来直接换成调用pigz多线程解压,虽然pigz在解压时不如在压缩时能体现出多线程优势,但是相对直接gunzip还是快了些,反正机器有的是CPU,主要是磁盘性能不行。
[perl]
#!/usr/bin/perl
use warnings;
use strict;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError);
my %dtimes;
my %dseconds;
my $DEBUG=1;
my @logs;
my $PRE="/home/test/temp";
my $tempfile="$PRE/gunziptemp";
my @time=(1,2,3,4,5,6,7,8,9,10);
opendir my $DIR,"$PRE" or die "open dirctory failed";
while(my $dir=readdir $DIR) {
push @logs,$dir if $dir =~/log.gz/ ;
}
close $DIR;
foreach my $log(@logs) {
print STDERR "analysis $log\n" if ($DEBUG ==1 );
# open my $logfd,"<$PRE/$log" or die "open $log failed\n";
# open my $unziplog,">$tempfile" or die "open unzip file failed\n";
# gunzip $logfd => $unziplog or die "unzip $log failed\n";
`pigz -d -k -c $PRE/$log >$tempfile ` or "unzip $log failed\n";
print STDERR "unzip $log ok \n" if ($DEBUG ==1 );
# close $unziplog;
open my $unziplog,"<$tempfile" or die "open2 unzip file failed\n";
print STDERR "start analysis log\n" if ($DEBUG ==1 );
while(my $line=<$unziplog>) {
my @temp;
my ($domain,$restime);
if($line=~/xxxx.com/) {
@temp=split(/\s+/,$line);
$domain=$temp[7];
$restime=$temp[-1];
next if( $restime !~ /\d+/);
next if( $domain !~ /xxxx.com/ );
$domain=~s/:\d+//;
}
if(defined $domain && defined $restime ){
$dtimes{$domain}++;
my @t=grep { $_ – $restime <0} @time;
foreach my $k(@t){
$dseconds{$domain}{$k}++;
}

}

}
close $unziplog;
# close $logfd;
unlink $tempfile or die "rm $log failed\n";
print STDERR "finish $log analysis\n" if ($DEBUG ==1 );
}
print "domain\t",join(" ",@time),"\n";
foreach my $domain(sort keys%dseconds) {
print "$domain ";
foreach my $t(@time) {;
$dseconds{$domain}{$t} =0 if (!defined $dseconds{$domain}{$t});
my $per=($dtimes{$domain}-$dseconds{$domain}{$t})/$dtimes{$domain}*100;
printf(" %.4f",$per);

}
print "\n";

}

[/perl]

主要是由于日志实在太大了,机器的磁盘有限就200多GB的空间,所有的日志直接解压放不下。由于是单进程串行执行,所以直接线把日志名都放一个列表里面。然后对每个日志进行解压,分析,并把结果放到一个hash里面。我是统计了后端服务器在1-10s内的响应率,grep { $_ – $restime <0} @time直接就能把把响应时间小于分别小于1-10的返回到一个列表里面,一定要避免对于每个时间都重新扫一次日志,那样就慢10倍了。 Screenshot from 2012-12-27 00:08:37

此条目发表在Perl Script分类目录。将固定链接加入收藏夹。

发表回复