bash, еще bash, еще много-много bash

29.10.18

База данных - Технологический журнал

Делюсь своим опытом параллельного разбора технологического журнала. По мотивам статьи https://infostart.ru/public/928184.

Оригинальная публикация была сделана еще год назад. Тогда пришлось вручную запускать 15 скриптов для разбора технологического журнала (около 60 Гб в первые дни). Перспектива делать это каждый день на протяжении двух недель меня не обрадовала. Поэтому решил поизучать мануалы по bash для написания управляющего скрипта. Приятным бонусом стала информация о том, что можно реализовать параллельный запуск. В итоге написал скрипт:

#!/bin/bash
#main.sh - one script to rule them all
#scr/* script_dir
#$1 tech_log_dir
#$2 result_dir

if [ "$1" = "" ] 
then 
echo 'set param tech_log_dir (1)'
exit
fi

tech_log_dir=$1

if [ "$2" = "" ] 
then 
result_dir=$(basename $1)
else
result_dir=$2
fi

if ! [ -d $result_dir ]
then
mkdir $result_dir
fi

for i in scr/*.sh; do $i $tech_log_dir $result_dir & done

Реализованы два варианта запуска:
$ bash main.sh /e/techlog - анализирует данные в каталоге /e/techlog, создает в каталоге скрипта подкаталог techlog и складывает в него результаты разбора
$ bash main.sh /e/techlog /f/result - анализирует данные в каталоге /e/techlog и складывает в /f/result результаты разбора

Рабочие скрипты складываются в подкаталог /scr каталога расположения основного скрипта.

Примеры адаптации скриптов с ИТС под передаваемые параметры и структуру каталогов технологического журнала:

#!/bin/bash
#scr/long_transactions.sh
cat $1/events/rphost*/*.log | \
perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' | \
perl -pe 's/\xef\xbb\xbf//g' | \
grep -P "SDBL.*Func=(Commit|Rollback)Transaction.*Context" | \
perl -pe 's/^\d+:\d+.\d+-//g' | \
perl -pe 's/,SDBL,.*Context.*<line>[ \t]+/,Context=/g' | \
perl -pe 's/,SDBL,.*Context=/,Context=/g' | \
sed 's/<line>//g' | \
awk -F',Context=' '{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {print sum[i] " " sum[i]/count[i] " " count[i] " " i}}' | \
sort -rnb | \
head -n 5 > $2/long_transactions.txt
#!/bin/bash
#scr/long_calls.sh
cat $1/events/rphost*/*.log | \
perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' | \
perl -pe 's/\xef\xbb\xbf//g' | \
grep -P ",CALL,.*,Context=" | \
perl -pe 's/<line>//' | \
perl -pe 's/^\d+:\d+.\d+-//g' | \
perl -pe 's/,CALL,.*Context/,Context/g' | \
perl -pe 's/,Interface=.*OutBytes=\d+//g' | \
awk -F',Context=' '{sum[$2]+=$1; count[$2]+=1;} END {for(i in sum) {printf "%d %d %d %s\n",sum[i],sum[i]/count[i], count[i],i}}' | \
sort -rnb | \
head -n 5 > $2/long_calls.txt

Эффект от параллельного выполнения моих пятнадцати скриптов:

 

 

технологический журнал bash

См. также

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    5153    ivanov660    12    

56

Технологический журнал Мониторинг Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

15.11.2023    1570    8    AlexSTAL    0    

8

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    4733    9    AlexSTAL    0    

47

Администрирование СУБД Технологический журнал Системный администратор Бесплатно (free)

Для расследования проблем производительности недостаточно просто проанализировать технологический журнал. Нужен парсинг контекста событий, его сопоставление с информацией из Extended Events и логов, агрегация огромного количества информации.

21.09.2023    7261    Andreynikus    14    

83

Технологический журнал Системный администратор Программист Платформа 1С v8.3 Абонемент ($m)

Целью данного решения является организация хранения и анализа данных из технологического журнала 1С с использованием стека Elasticsearch + Logstash + Kibana.

5 стартмани

18.09.2023    5093    huxuxuya    6    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. nnsidorov22 20.01.21 22:31 Сейчас в теме
Добрый день. Можете помочь разобрать следующий скрипт: perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' ?
Я понимаю что идет преобразование многострочного текста к однострочному, но пошагово не понимаю логику скрипта. Для чего идет вот этот кусок скрипта: $event = ""? И почему в конце ещё раз выводится переменная: print $event?
Оставьте свое сообщение