Performance 如何更快地分析4核服务器上的apache日志

Performance 如何更快地分析4核服务器上的apache日志,performance,apache,logging,core,Performance,Apache,Logging,Core,我们每周都有很多apache日志,几乎420G/周,只有一台服务器可以分析日志,日志如下 192.168.1.1 - - - [11/Jul/2011:23:59:59 +0800] "GET /test.html HTTP/1.1" 200 48316 31593 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.7.1030)" - - "a=-; b=-; c=-" - 我

我们每周都有很多apache日志,几乎420G/周,只有一台服务器可以分析日志,日志如下

192.168.1.1 - - - [11/Jul/2011:23:59:59 +0800] "GET /test.html HTTP/1.1" 200 48316 31593 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.7.1030)" - - "a=-; b=-; c=-" -
我的任务是得到所有2xx的响应,每30分钟得到一次平均tps,我的解决方案是

gzcat %s |  awk '{print $5, $10}' | grep -E \"*[\ ]2[0-9][0-9]$\" | awk -F \"[\" '{print $2}' | awk '{print $1}' | sort -n -k -1 | uniq -c 
然后通过一些计算更容易得到结果


我测试了代码,它可以以100MB/20sec的速度处理代码,也就是5MB/s,所以对于420G,我必须用将近一天的时间来处理它,如何让它更快,因为这台服务器有4个内核和8G内存,有更好的解决方案吗

该管道(7个进程!)的性能将很差。您希望使用尽可能少的进程。用perl或python编写整个过程。如果不将日志文件拆分为4个部分,这仍然只是一个核心,但至少速度很快。

为简单起见,此报告的平均响应时间和点击次数/秒:

假设$10是http状态,$11是响应时间,$4是日期字符串的第一部分

BEGIN {
    reset();
    last="";
}
END {
    dump();
}
$10 ~ /^2[0-9][0-9]$/ {
# $4=[11/Jul/2011:14:04:59
  hfhour=substr($4,2,15) (substr($4,17,1)>"2" ? "30" : "00" );
  if (hfhour!=last) {
   dump();
   reset();
  }
  count++;
  tot += $11
}
function reset()
{
    last=hfhour;
    count=0;
    tot=0;
}
function dump()
{
 if (count) {
    print hfhour " " count " " tot/count " " count/1800;
 }
}
不确定tps是否是此类分析的一个非常有用的指标


将作业分片以跨多个内核运行不太可能产生速度更快的结果

第一个awk命令的输出如下:

[11/Jul/2011:23:59:59 200
使用此格式,您可以大大简化grep命令,例如:

fgrep ' 2'
也就是说,您grep的空间,其中只有一个将由awk作为输出字段分隔符添加,以及结果代码的开始。通过使用fgrep而不是grep,您告诉grep您不是在使用正则表达式进行查询,而是在搜索固定字符串,这使得查询速度大大加快

此外,您还可以通过组合最后的awk命令来获得更高的速度。发件人:

awk -F \"[\" '{print $2}' | awk '{print $1}'
致:


这个脚本也使用了我的pc的两个核心,尽管第二个不是100%使用。如果要使用所有核心,必须将要分析的数据分成四部分,并行处理,然后合并结果。

使用此答案,速度快了近20%。如果需要额外的速度增益,请尽量避免最后的排序命令。Web服务器日志通常不需要排序。另外,为了提高速度,python脚本可以做得更好。
awk -F '[[ ]' '{print $2}'