Как быстрее анализировать лог apache на 1 сервере с 4 ядрами - PullRequest
0 голосов
/ 15 июля 2011

У нас есть много журналов apache каждую неделю, почти 420 ГБ в неделю, и только сервер для анализа журнала, журнал такой как

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 и получить среднее значение tps за каждые 30 минут, и мое решение -

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 

тогда легче получить результат, используя некоторые вычисления.

Я тестирую код, и он может обрабатывать код со скоростью 100 МБ / 20 с, что составляет всего 5 МБ / с, поэтому с 420G мне приходится использовать почти день для обработки, как сделать это быстрее, так как этот сервер имеет ядро и память 8G, есть ли лучшее решение?

Ответы [ 3 ]

1 голос
/ 15 июля 2011

Вывод первой команды awk выглядит примерно так:

[11/Jul/2011:23:59:59 200

С этим форматом вы можете значительно упростить команду grep, используя, например:

fgrep ' 2'

То есть, вы grep для пространства, из которого awk добавит только один в качестве разделителя выходного поля, и начало результирующего кода. Используя fgrep вместо grep, вы говорите grep, что вы не запрашиваете регулярное выражение, а ищете фиксированную строку, и это делает ее намного быстрее.

Кроме того, вы можете увеличить скорость, комбинируя последние команды awk. От:

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

Кому:

awk -F '[[ ]' '{print $2}' 

Этот скрипт также использует оба ядра моего компьютера, хотя второе не используется на 100%. Если вы хотите использовать все свои ядра, вам придется разделить данные для анализа на четыре части, обработать их параллельно и затем объединить результаты.

0 голосов
/ 15 июля 2011

Для простоты это сообщает среднее время отклика и хитов в секунду:

Предполагая, что $ 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 - очень полезная метрика для такого анализа.

Разделение работы на несколько ядер вряд ли приведет к чему-то более быстрому.

0 голосов
/ 15 июля 2011

Этот конвейер (7 процессов!) Будет работать плохо.Вы хотите использовать как можно меньше процессов.Напишите все это на Perl или Python.Это все еще одно ядро, если вы не разбиваете лог-файл на 4 части, но, по крайней мере, это быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...