로그 파일에서 최대 TPS 계산

로그 파일에서 최대 TPS 계산

애플리케이션 로그 파일의 최대 tps를 계산하는 bash 스크립트가 있습니다. 스크립트는 작동하지만 수백만 개의 항목이 있는 파일에서 실행하는 데 몇 시간이 걸립니다. 로그 항목에는 다음과 같은 패턴이 있습니다.

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

스크립트에는 가능한 모든 시:분:초 조합을 파악하고 각 조합에 대한 일치 수를 계산하는 루프가 있으며, 매번 이전 최고 수와 비교하여 최고 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) 입력 파일은 타임스탬프별로 정렬됩니다. 하루 동안의 항목입니다(즉, 첫 번째 열은 일정합니다).

나는 몇 가지를 시도했습니다. (1) --mmap에 추가하고 grep(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

관련 정보