Calcula o máximo de TPS do arquivo de log

1

Eu tenho este script bash para calcular o máximo de tps do arquivo de log de um aplicativo. O script funciona, mas leva várias horas para ser executado em arquivos com milhões de entradas. As entradas de log têm o seguinte padrão:

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

O script tem um loop para grep para todas as possíveis combinações hora: minuto: segundo e conta as correspondências para cada uma, cada vez comparando com a contagem mais alta anterior para atualizar o pico do 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

Esta é a maneira direta de calcular o TPS máximo, mas estou pensando se há uma maneira de otimizá-lo, talvez usando algumas heurísticas sobre a entrada: (1) o arquivo de entrada é classificado pelo registro de data e hora; (2) contém apenas entradas para um dia (ou seja, a primeira coluna é constante).

Eu tentei algumas coisas: (1) Adicionando --mmap a grep ; (2) pré-encontrar todos os carimbos de tempo e procurar apenas aqueles:

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

nenhum produziu muitas melhorias. Tenho certeza de que esta é uma pergunta de teste clássica, mas não consigo encontrar a resposta. Vocês podem ajudar?

Atenciosamente!

    
por Pancho 09.11.2015 / 21:43

1 resposta

0

O comando a seguir captura apenas o registro de data e hora (caracteres 12-19) do arquivo de log e, em seguida, (já que eles já estão classificados), executa uniq -c , que produz uma contagem de cada entrada exclusiva (registro de data e hora) ). O restante do pipeline apenas classifica a saída resultante pela primeira (contagem) coluna maior primeiro e, em seguida, exibe o primeiro resultado.

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

Como alternativa, faça um ... sort -n | tail -1

    
por 10.11.2015 / 20:15

Tags