从日志文件计算最大TPS

从日志文件计算最大TPS

我有这个 bash 脚本来计算应用程序日志文件的最大 tps。该脚本可以工作,但在具有数百万条目的文件上运行需要几个小时。日志条目具有以下模式:

2015-11-01 14:34:20,969 TRACE [Thread-2868] [TrafficLogger] service transaction data
2015-11-01 14:34:20,987 TRACE [Thread-2868] [TrafficLogger] service transaction data

该脚本有一个循环,用于 grep 所有可能的小时:分钟:秒组合,并计算每个组合的匹配数,每次与之前的最高计数进行比较以更新峰值 TPS:

for h in {00..23}; do
  for m in {00..59}; do
    for s in {00..59}; do
      tps=$(grep -c "${h}:${m}:${s}" $log_file)
      if [ "$tps" -gt "$peak_tps" ]; then
            peak_tps=$tps
      fi
    done
  done
done

这是计算最大 TPS 的直接方法,但我想知道是否有一种方法可以优化它,可能使用一些关于输入的启发式方法:(1)输入文件按时间戳排序; (2) 它仅包含一天的条目(即第一列是恒定的)。

我尝试了几件事:(1)添加--mmapgrep; (2) 预先查找所有时间戳并仅搜索那些:

for timestamp in $(awk '{print $2}' $log_file | cut -d \, -f 1 | sort -u); do
   tps=$(grep --mmap -c "${h}:${m}:${s}" $log_file)
   ...

两者都没有取得太大改进。我确信这是一个经典的测试题,但我似乎找不到答案。你们能帮忙吗?

问候!

答案1

以下命令仅从日志文件中截取时间戳(字符 12-19),然后(因为假定它们已排序)运行它,uniq -c生成每个唯一条目(时间戳)的计数。管道的其余部分只是按第一(计数)列最高优先对结果输出进行排序,然后显示第一个结果。

cut -c12-19 $log_file | uniq -c | sort -rn | head -1

或者,做一个...sort -n | tail -1

相关内容