Performance 如何更快地分析4核服务器上的apache日志
我们每周都有很多apache日志,几乎420G/周,只有一台服务器可以分析日志,日志如下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=-" - 我
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}'