Исследование технологического журнала 1С при помощи регулярных выражений в блокноте

Публикация № 693103

Администрирование - Производительность и оптимизация (HighLoad)

ТЖ Perl Bash

128
Все из тех, кто пробовали сдать на сертификат "Эксперт по технологическим вопросам 1С", сталкивались с методикой ЦКТП - разбор файлов технологического журнала при помощи консоли bash. Я, в свою очередь,внёс изменения в данную методику. Мне хотелось достичь более понятного вида и сфокусироваться на Perl, в качестве предпочтительного средства обработки файлов ТЖ. Вот что из этого вышло:

[Дополнение от 2017.11.23: Для тех, кому неинтересно читать - в репозитории есть готовая portable сборка и выкладываются готовые скрипты.]

 

Подготовка

Для начала подготовим удобную и комфортную среду исполнения. Для этого потребуются

  • Git Bash - эмулятор консоли bash со многоми дополнительными программами, важнейшей из который для нас является perl
  • Notepad++ - удобнейший редактор кода, который вместе с дополнением NppExec становится полноценной IDE для наших комфортного выполнения задач анализа

После скачивания и установки данных программ необходимо настроить. И настраивать понадобится только Notepad++. Идём в Plugin Manager и устанавливаем дополнение NppExec.

В его настройках выбираем формат локали (ConsoleOutput) - необходимо выбрать UTF-8 как для Input, так и для Output. (Plugins->NppExec->Console Output..)

В настройках Notepad++ обязательно поставьте замену табов на пробелы, иначе ничего не будет нормально работать. Лучше, если табов в тексте скрипта вообще не будет.

Теперь может писать наш первый скрипт.

Напишем простую команду: ls -l, нажмём F6 для запуска и настроим его команды:

npp_save - этот макрос сохранит текущий скрипт перед выполнением
"C:\Program Files\Git\bin\bash.exe"  "$(FULL_CURRENT_PATH)" - запускаем bash и передаём в качестве аргумента имя открытого файла

Теперь результат выполнения операций будет отображаться внизу, в дополнительном окне самого Notepad++.

 

 

Обработка

Начнём обработку. Допустим, нас интересует суммарная продолжительность вызовов к СУБД (SDBL) в разрезе контекстов. Выбирать информацию мы будем из технологического журнала 1с (вопросы его настройки здесь рассматриваться не будут).

Так как полный текст одного события в ТЖ 1с может быть разбит на несколько строк, то нам сначала нужно склеить все строки, принадлежащие одинаковым событиям, чтобы в дальнейшем обрабатывать их уже построчно.

Я реализовал такой алгоритм склейки строк одного события:

  1. Заменяем все переносы строки на пробел (в других случаях это может быть любая необходимая последовательность)
  2. Если начало строки соответствует шаблону начала строки записи, то ставим перенос строки перед этой строкой.
perl -ne '{
    $_=~s/\r*\n/ /g;                        #\r*\n в пробел
    $_="\r\n".$_ if(/^\d\d:\d\d\.\d+/);     #если строка начинается с заголовка записи 1с строка начнётся с переноса
    print $_;}'

Таким образом мы получим список полного текста всех событий ТЖ.

После этого отрежем всю информацию от начала события до его длительности:

$_=~s/^\d{2}:\d{2}\.\d+-//;

и уберём весь текст от SDBL до контекста

$_=~s/,SDBL.*Context=/\@SDBL\@/;

После этих нехитрых манипуляций события на выходе приобретут следующий вид:

(длительность события)@(названия события-SDBL)@(и его контекст)

Небольшое пояснение по используемым в Perl конструкциям:

  • команда perl -ne означает лишь только выполнить программу, указанную в кавычках и передавать ей на вход строки на вход.
  • принимаемые строки попадают в системную переменную Perl - $_
  • операция $_=~s/123/321/g; есть ни что иное, как присвоение переменной $_ результатов замены содержимого $_ в соответствии с регулярным выражением s/123/321/g. В данном контексте 123 меняется на 321.

Теперь при помощи AWK можно просуммировать длительность и количество событий по контексту.

Результирующий скрипт будет примерно таким:

cat //server/c$/1clog/sdbl/rphost_*/*.log | \
perl -ne '{
    $_=~s/\xef\xbb\xbf//g;                  #BOM
    $_=~s/\r*\n/ /g;                        #\r*\n в пробел
    $_=~s/\s+/ /g;                          #и много пробелов - в 1    
    $_="\r\n".$_ if(/^\d\d:\d\d\.\d+/);     #если строка начинается с заголовка записи 1с строка начнётся с переноса
    print $_;}' | \
perl -ne '
    if ((/,SDBL.*Context=.{3}/)){           #по событиям SDBL
        $_=~s/^\d{2}:\d{2}\.\d+-//;         #Убрать всё начала строки до длительности операции
        $_=~s/,SDBL.*Context=/\@SDBL\@/;    #Убираю ненужную информацию между ,SDBL и Context=
        $_=~s/\x27//g;                      #апострофы тоже все в сад
        print $_;
    }' | \
awk -F'@' '{
        sum[$3]+=$1;                        #суммирую продолжительность
        ttl+=$1;                            #общая продолжительность
        cnt[$3]+=1;                         #суммирую количество
        ct+=1;                              #и общее количество увеличивается
}
    END{
        printf "%d %s %'\''d %s %'\''d %s %d\n", ttl, "=====SDBL TOTAL(ms)", ttl/1000, "COUNT:", ct, "AVG(ms):", ttl/ct/1000
        for(i in sum){
            printf "%d %s %'\''d %s %'\''.2f %s %'\''d %s %'\''.2f %s %'\''d %s\n",
            sum[i],
            "TOTAL(ms):", sum[i]/1000,
            "TOTAL(ms)%:", sum[i]/ttl*100,
            "COUNT:", cnt[i],
            "COUNT%:", cnt[i]/ct*100,
            "AVG(ms):", (cnt[i]>0?sum[i]/cnt[i]/1000:sum[i]/1000),
            "CONTEXT="i
    }}' | \
sort -rnb | \
head -n 11 | \
perl -pe 's/\d+\s/\r\n/;                    #первое число - продолжительность для сортировки меняем на переносы строк для удобства восприятия'

Небольшое пояснение по используемым в AWK конструкциям:

  • -F'@' - означает что в качестве разделителя полей выступает символ @. Разделителем можно назначить как символ, так и последовательность.
  • значения между разделителями в awk попадают в переменные служебные переменные $1, $2, $3 итд. (в зависимости от количества полей). В $0 приходит вся строка, без разбивки по разделителям.
  • команда printf в первом параметре определяем типы выводимых значений и их форматирование, так:
    %s - строка
    %d - целое, %'\''d означает группировку по 3 частей целого числа (123456 = 123 456, для удобства восприятия)
    %f - float, %'\''.2f означает группировку по 3 частей числа с округлением до двух знаков после запятой (123456,1234 = 123 456,12 для удобства восприятия)

Таким незамысловатым образом, мы можем увидеть, что 2,46% обращений к СУБД контекста "ДинамическийСписок.ПолучитьДанные : ЖурналДокументов.КадровыеДокументы.Форма.ФормаСписка.Реквизит.Список" создали 60,36% процентов нагрузки.

 

Ныряем глубже

Так как в записях журналов регистрации 1с не содержится информация о часе и дате, а мне очень бы хотелось использовать для отборов и их, то попробуем получить и эти данные:

grep -r ".*" -H /c/rphost_*/*.log

В таком формате команда grep будет выводить перед каждой строкой имя файла, в пути и имени которого содержится дополнительная информация:

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

Здесь на помощь снова приходит Perl со своими мощными регулярными выражениями.

grep -r ".*" -H /c/rphost_*/*.log  | \
perl -ne '{
    $_=~s/\xef\xbb\xbf//g;                      #BOM
    $_=~s/\r*\n/ /g;                            #\r*\n
    $_=~s/\x27//g;                              #убираю апострофы
    $_=~s/\s+/ /g;                              #сворачиваю последовательности пробелов в один
    if(/\d\d:\d\d\.\d+/){
        while(s/^.*_(\d+)\/(\d{2})(\d{2})(\d{2})(\d{2})\.log\:(\d+:\d+\.\d+)\-(\d+),(\w+),(\d+)//){
            $_="\r\n"."dt=20".$2.".".$3.".".$4.",time=".$5.":".$6.",pid=".$1.",dur=".$7.",evnt=".$8.",ukn=".$9.$_ ;
        }
    }else{$_=~s/^.*log://;}                     #из перенесённых строк просто вытираю начало    
    print $_;}'| \
head -n 150

Результатом такой обработки строк будет удобный и читаемый вид:

Теперь становится возможным разделить поля по разделителю(то есть выводить только те поля, что нам реально нужны). Например, необходимо вывести только дату, время и контексты всех SCALL'ов

grep -r ".*" -H /c/rphost_*/*.log  | \
perl -ne '{
    $_=~s/\xef\xbb\xbf//g;                      #BOM
    $_=~s/\r*\n/ /g;                            #\r*\n
    $_=~s/\x27//g;                              #убираю апострофы
    $_=~s/\s+/ /g;                              #сворачиваю много пробелов в один
    if(/\d\d:\d\d\.\d+/){
        while(s/^.*_(\d+)\/(\d{2})(\d{2})(\d{2})(\d{2})\.log\:(\d+:\d+\.\d+)\-(\d+),(\w+),(\d+)//){
            $_="\r\n"."dt=20".$2.".".$3.".".$4.",time=".$5.":".$6.",pid=".$1.",dur=".$7.",evnt=".$8.",ukn=".$9.$_ ;
        }
    }else{$_=~s/^.*log://;}                     #из перенесённых строк просто вытираю начало    
    print $_;}'| \
perl -ne '{
    if(/time=.*evnt=SCALL.*Context=/){
        for (split /(?=\,\w+:*\w*=)/, $_){
            $_=~s/,//g;
            print $_."  [][][] " if(/dt=/);
            print $_."  [][][] " if(/time=/);
            print $_."  [][][] " if(/evnt=/);
            print $_ if(/Context=/);
        }
    }
}' |\
head -n 150

Результат будет весьма наглядным:

 

Бритва Оккама

В представленных выше группировках по полям всё ещё используется AWK, хотя в самом Perl есть не менее мощные возможности для оперирования данными.

Можно убрать и AWK, и сортировку при помощи команды sort -rnb, и вывод только 10 строк при помощи head.

Попробуем же только средствами Perl подсчитать количество и продолжительность событий SDBL в разрезе контекстов:

time grep -r ".*" -H /c/rphost_*/*.log  | \
perl -ne '{
    $_=~s/\xef\xbb\xbf//g;                      #BOM
    $_=~s/\r*\n/ /g;                            #\r*\n
    $_=~s/\x27//g;                              #убираю апострофы
    $_=~s/\s+/ /g;                              #сворачиваю много пробелов в один
    if(/\d\d:\d\d\.\d+/){
        while(s/^.*_(\d+)\/(\d{2})(\d{2})(\d{2})(\d{2})\.log\:(\d+:\d+\.\d+)\-(\d+),(\w+),(\d+)//){
            $_="\r\n"."dt=20".$2.".".$3.".".$4.",time=".$5.":".$6.",pid=".$1.",dur=".$7.",evnt=".$8.",ukn=".$9.$_ ;
        }
    }else{$_=~s/^.*log://;}                     #из перенесённых строк просто вытираю начало    
    print $_;}'| \
perl -ne '                                      #perl умеет работать как AWK
    if(/dur=(\d+),evnt=SDBL.*Context=(.*)/){
        $dur_ttl+=$1/1000;
        $dur{$2}+=$1/1000;
        $cnt_ttl+=1;
        $cnt{$2}+=1;
    }
    END{
        printf("=====TIME TOTAL(ms):%.2f      COUNT:%d      AVG(ms):%.2f\r\n",
               $dur_ttl,
               $cnt_ttl,
               $dur_ttl/$cnt_ttl);              #формирую заголовок
        foreach $k (sort {$dur{$b} <=> $dur{$a}} keys %dur) {
            printf "[][][] TIME(ms):%d [][][] TIME(%):%.2f [][][] COUNT:%d [][][] COUNT(%):%.2f [][][] BY:%s \r\n",
            $dur{$k},
            $dur{$k}/$dur_ttl*100,
            $cnt{$k},
            $cnt{$k}/$cnt_ttl*100,
            $k;                                 #сортирую массив по убыванию длительности и вывожу его
            last if ($_+=1)>10;                 #но только первые 10 строк
        }
    }'

Результатом будет очень быстрая обработка всего массива ТЖ для получения интересующей нас информации.

Оценить скорость выполнения всегда можно командой time в самом начале выполнения.

Пояснения по конструкция Perl:

  •  
    if(/dur=(\d+),evnt=SDBL.*Context=(.*)/){ #если у строки есть dur=\d+, его evnt=SDBL И у него есть контекст
        $dur_ttl+=$1/1000; 
        $dur{$2}+=$1/1000; #суммируем продолжительность - $1 (первые круглые скобки(\d+)) по контексту - $2 (Context=(.*))
        $cnt_ttl+=1;
        $cnt{$2}+=1;       #суммируем количество контекстов - $2 (Context=(.*))
    }
  •  
foreach $k (sort {$dur{$b} <=> $dur{$a}} keys %dur) { #сортировка массива и обход по всем его ключам
  •  
last if ($_+=1)>10; #каждый проход мы увеличиваем на 1 переменную $_. Выходим, если число проходов превысило 10
  •  

 

Оптимизация

Обработка(парсинг) ТЖ - чрезвычайно ресурсоёмкое занятие. ТЖ запросто могут достигать нескольких десятков (а то и сотен) гигабайт. И выборка информации из них может занимать ОЧЕНЬ продолжительное время.

Поэтому весь код для парсинга должен быть максимально эффективным.

В предыдущем примере в первом вызове Perl склеиваются все строки, даже не отбираемые во втором вызове (подсчёт). То есть мы обрабатываем в первом проходе те строки, которые не понадобятся во втором.

Немного модифицируем отбор для того, чтобы склеивать строки только по нужному событию. Справедливости ради стоит заметить, что сразу всё необходимое - SDBL с контекстом - мы отобрать не сможем, потому что перед склейкой строк контекст может находиться на разных строчках с событием.

echo "Длительность событий SDBL в резрезе контекстов"
time grep -r ".*" -H /c/v8/logs/*/*.log  | \
perl -ne '
    s/\xef\xbb\xbf//;                               #BOM - обязательно в начале, иначе с певой строкой будут проблемы
    if(/log:\d\d:\d\d\.\d+-\d+,(\w+),/){            #если в строке есть идентификатор начала строки и это наш тип события
        if($1 eq "SDBL"){                           #первоначальный отбор по событиям            
            s/\s+/ /g;                              #сворачиваю много пробелов в один, и перенос строки тоже здесь улетит в пробел
            if(s/^.*_(\d+)\/(\d{2})(\d{2})(\d{2})(\d{2})\.log\:\s*(\d+:\d+\.\d+)\-(\d+),(\w+),(\d+)//){
                $_="\r\n"."dt=20".$2.".".$3.".".$4.",time=".$5.":".$6.",pid=".$1.",dur=".$7.",evnt=".$8.",ukn=".$9.$_ ;                
            }
            $f=1;
        }else{$f=0};
    }
    elsif($f) {                                     #если наше событие, то обрабатываем эту висячую  строку
        s/^.*log://;                                #из перенесённых строк просто вытираю начало
        s/\s+/ /g;                                  #сворачиваю много пробелов в один, и перенос строки тоже здесь улетит в пробел
    }
    if($f){
        s/\x27//g;                                  #убираю апострофы
        print;
    }END{print "\r\n"}                              #надо поставить, чтобы последняя строка в обработку попала
' | \
perl -ne '                                          #perl умеет работать как AWK
    if(/dur=(\d+),evnt=SDBL.*Context=(.*)$/){
        $dur_ttl+=$1/1000;
        $dur{$2}+=$1/1000;
        $cnt_ttl+=1;
        $cnt{$2}+=1;
    }
    END{
        printf("=====TIME TOTAL(ms):%.2f      COUNT:%d      AVG(ms):%.2f\r\n",
            $dur_ttl,
            $cnt_ttl,
            $dur_ttl/$cnt_ttl);                     #формирую заголовок
        foreach $k (sort {$dur{$b} <=> $dur{$a}} keys %dur) {
            last if ($_+=1)>10;                     #но только первые 10 строк
            printf "$_: [][][] TIME(ms):%d [][][] TIME(%):%.2f [][][] COUNT:%d [][][] COUNT(%):%.2f [][][] BY:$k \r\n",
            $dur{$k},
            $dur{$k}/($dur_ttl>0?$dur_ttl:1)*100,
            $cnt{$k},
            $cnt{$k}/($cnt_ttl>0?$cnt_ttl:1)*100;   #сортирую массив по убыванию длительности и вывожу его
        }
    }'

Теперь оценим скорость выполнения:

Скорость отбора той же самой информации увеличилась в 5 раз!

 

 

Вместо заключения

Надеюсь, данная статья поможет Вам раскрыть новые возможности и измерения анализа ТЖ 1с.

Если какие-то моменты остались непонятными, то напишите о них в комментариях. Я постараюсь описать их более подробно.

Рабочие примеры скриптов парсинга ТЖ по описанным выше методикам доступны в открытом репозитории Bash1C. Присоединяйтесь!

 

 

128

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Darklight 19 30.10.17 18:03 Сейчас в теме
ох... как всё жестоко... прямо хакинг какой-то
2. herfis 283 30.10.17 18:20 Сейчас в теме
Плюсанул.
(1) Неудивительно. Вводной статьей это никак нельзя назвать.
Предполагается, что вы уже умеете в регулярные выражения и немножко знакомы с POSIX (в части общеупотребимых никсовых команд и работы командного интерпретатора). Короче, нужно уже быть немножко линуксоидом.
Kami4; Сурикат; +2 Ответить
21. starik-2005 1959 11.11.17 21:20 Сейчас в теме
(2)
вы уже умеете в регулярные выражения и немножко знакомы с POSIX (в части общеупотребимых никсовых команд и работы командного интерпретатора)
Это о чем?
POSIX (англ. portable operating system interface — переносимый интерфейс операционных систем) — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой (системный API), библиотеку языка C и набор приложений и их интерфейсов. Стандарт создан для обеспечения совместимости различных UNIX-подобных операционных систем и переносимости прикладных программ на уровне исходного кода, но может быть использован и для не-Unix систем.


Cygwin состоит из двух частей: динамически подключаемой библиотеки (DLL) cygwin1.dll, которая обеспечивает совместимость API и реализует значительную часть стандарта POSIX, и огромной коллекции приложений, которые обеспечивают привычную среду UNIX, включая Unix shell.


Т.е. POSIX и Unix Shell - это совсем разное, поэтому придираюсь...
22. herfis 283 13.11.17 10:24 Сейчас в теме
(21) Не готов спорить. Вики тут не помощник, а в спецификации POSIX лезть лень. Но если уж придираетесь, тогда идите до конца :) Мне тоже будет интересно узнать. На вики написано "и набор приложений и их интерфейсов", что очень расплывчато. Но очевидно, что туда входит описание ряда стандартных команд и приложений. Входит ли сюда командный интерпретатор или нет - непонятно. Мне кажется, что базовые принципы работы командного интерпретатора, типа перенаправления ввода-вывода, должны быть там прописаны.
23. starik-2005 1959 13.11.17 11:32 Сейчас в теме
(22)
типа перенаправления ввода-вывода
Так это и в досовской еще ОСи было: "type filename | more". Это к POSIX вряд ли имеет отношение, ибо ДОС уж точно никогда даже и не позиционировался, как POSIX (в отличие от винды NT).
24. herfis 283 13.11.17 14:24 Сейчас в теме
(23) Ок, сам нашел состав стандарта.
Один из четырех разделов POSIX: Оболочка и утилиты (англ. Shell and utilities) — описание утилит и командной оболочки sh, стандарты регулярных выражений.
3. MrWonder 574 30.10.17 21:51 Сейчас в теме
(1) а что подробнее расписать? какая часть самая непонятная?
4. Armando 1391 30.10.17 23:55 Сейчас в теме
На эксперте только bash котируется? Powershell не?
surikateg; +1 Ответить
5. MrWonder 574 31.10.17 00:32 Сейчас в теме
6. LexSeIch 202 31.10.17 09:23 Сейчас в теме
(5) Такой ответ - фраза, ставящая в тупик многих иностранцев :-) Статья интересная - пошёл по ссылкам нашёл на русском электронную версию книги "ProGid"... Спасибо!
15. AlX0id 02.11.17 08:14 Сейчас в теме
(4)
Ну у меня пару лет назад одним из практических вопросов было: найти в 30 Гб ТЖ таймаут на блокировке и объяснить.
С помощью грепа он находился где-то за минуту на не очень выдающемся ноуте. Если Powershell способен это повторить, то вайнот.
Объяснить я пытался при помощи как раз таки нотпад++. В тот кон, правда, не объяснил :) Но проблема была не в нотпаде.
7. logarifm 1047 31.10.17 12:13 Сейчас в теме
Какой размер файла удается таким образом анализировать? Я имею ввиду файлы ТЖР. Сколько будет парсить файл к примеру с 10 Гб?
9. MrWonder 574 31.10.17 12:45 Сейчас в теме
(7) Вы же понимаете, что у Вашего вопроса очень много если. Например, скорость СХД, на которой лежит файл. Доступные процессорные ресурсы и.т.д.
Сейчас попробовал у себя: 3,68 GB чистых SDBL'ей на шпинделе по сети распарсились до окончательного результата за 110 секунд. То же самое локально - 90 секунд.
10. stveans@gmail.com 11 01.11.17 12:21 Сейчас в теме
(9)А в сравнении на том же оборудовании с git bash, cygwin?
11. herfis 283 01.11.17 12:36 Сейчас в теме
(10) Так он в git bash и парсил, насколько я понял.
Кстати, вроде в Windows 10 запилили Windows Subsystem for Linux и для подобных вещей отпадает необходимость в установке cygwin и иже с ними.
Правда, не уверен на сто процентов, что получится из нотепада выполнять.
(8) В bash, при необходимости, тоже можно разбивать на фоны. В любом случае это заведомо быстрее, чем средствами 1С. И при этом универсальнее.
12. MrWonder 574 01.11.17 14:16 Сейчас в теме
(11) Всё верно, я использовал Git Bash. Об этом явно написано в начале статьи. Можно и под cygwin. И с bash в Win10 можно настроить (при условии наличия Perl). Но в рамках данной статьи я вариации со средой исполнения не буду расмматривать.
14. stveans@gmail.com 11 01.11.17 15:13 Сейчас в теме
(12)Понял. Недоглядел, думал этот плагин самостоятельный, а он оказывается использует стороннюю программу.
(10)Что касается подсистемы в Windows 10 - она ещё в бета версии и имеются ошибки. Например, у меня склейка строк с помощью awk неправильно работает в 10. В git bash, cygwin с этим всё в порядке.
13. MrWonder 574 01.11.17 14:17 Сейчас в теме
(9) отвечаю сам себе - используй команду time !
8. logarifm 1047 31.10.17 12:21 Сейчас в теме
Я пытался это решить посредствами самой 1С. Последовательным чтением файлов ТЖР. При этом разбивая на фоны.
https://infostart.ru/public/418347/
16. A_Max 17 08.11.17 13:27 Сейчас в теме
Очень порадовал комментарий "#perl умеет работать как AWK" :о)
Когда в первый раз увидел статью как раз и удивился смеси использования perl/grep/awk
17. MrWonder 574 09.11.17 09:38 Сейчас в теме
(16) Истоки сего смешения явились из здания на Дмитровском шоссе )
Эволюция по тексту тоже, думаю, прослеживается
18. magicbuka 10.11.17 11:53 Сейчас в теме
(17) Алексей, а экзамен то в итоге сдали?
19. MrWonder 574 10.11.17 14:22 Сейчас в теме
(18) На текущий момент - нет.
20. starik-2005 1959 11.11.17 21:16 Сейчас в теме
25. c1nil 11.01.18 09:36 Сейчас в теме
Когда-то экспериментировал с Perl 6 для этих целей. Скорости такой не получил, конечно. Но склеить строки за первый проход можно сразу, а потом отформатировать в html, например или во внутреннее представление по средствам классов, которые специальным образом обрабатывают "grammar".
Что нашёл из экспериментов с грамматиками (grammar):
https://gist.github.com/mrDSide/217695e9db031b9f32eb04a543298c53
Более развёрнутый пример с "made", "make" не нашёл уже. Но есть документация:
https://docs.perl6.org/language/grammars

П.С. делал разбор файла для ПУ-3 и получил полезный комментарий по поводу переноса строк (см. "token win - nl", "token lin-nl")
https://gist.github.com/araraloren/6051fd7aa24dad1b7f499e01bed3c03c
26. starik-2005 1959 11.01.18 10:20 Сейчас в теме
(25) а я вот sed использую - для большинства вещей хватает.
27. c1nil 11.01.18 11:29 Сейчас в теме
(26) Уверен, что так и есть. Я мало пользуюсь утилитами командной строки linux (пока). А по поводу sed отличный комментарий дал автор курса по анализу технологического журнала 1С с помощью регулярных выражений - предлагает использовать "perl -pe" вместо sed, т.к. на больших объёмах данных они кэшируются и обработка происходит быстрее.
К слову, можете использовать эти же утилиты в сценариях на Perl 6, там есть возможность вызова утилит командной строки в момент выполнения сценария с получением результата (вывода команды), так же есть конвееры, кроме того ещё и двунаправленные, если можно так сказать ("<==" и "==>") :) Модуль есть для отладки регулярных выражений (Grammar::Tracer).
Хотя лично у меня получилось больше всего информации извлечь и отладить проще всего с помощью PowerShell ISE.

UPD: справедливости ради нужно заметить, что "perl -pe", конечно, вызов интерпретатора perl 5, т.к. именно он на данный момент является интерпретатором по-умолчанию
MrWonder; +1 Ответить
28. RailMen 784 11.01.18 14:07 Сейчас в теме
Только начал готовиться к эксперту, а тут такая статья в тему. Спасибо!
29. MrWonder 574 11.01.18 14:49 Сейчас в теме
30. lustin 11.01.18 17:48 Сейчас в теме
(0) всем не знающим регулярные выражения посвящается https://github.com/silverbulleters/verbal-expressions

ВербальноеВыражение = Новый ВербальноеВыражение()
    .НачалоСтроки()
    .Затем("http")
    .МожетБыть("s")
    .Затем("://")
    .ЧтоНибудьНоНе(" ")
    .КонецСтроки();
Показать
Perfolenta; kote; mickey.1cx; +3 Ответить
34. kote 499 03.09.18 07:57 Сейчас в теме
35. MrWonder 574 03.09.18 09:58 Сейчас в теме
36. kote 499 03.09.18 10:27 Сейчас в теме
31. ADirks 181 12.01.18 07:23 Сейчас в теме
Для пущего ускорения я бы файлы самим перлом читал, а не через конвейер (grep ... | perl)
Сам перл это делает сильно быстрее.

к примеру
open LOG, "< $log_fname";
foreach $line (<LOG>)
{
$line =~ m/^\s*dt=([\d.]+).*$/;
print $1;
}
close LOG;

для чтения кучи файлов с логами можно использовать пакет File::Find

годная документация по перлу с примерами например тут есть https://www.activestate.com/activeperl
(мне реализация АктивПерл для винды больше всего нравится)
kote; A_Max; mickey.1cx; artbear; MrWonder; +5 Ответить
32. MrWonder 574 12.01.18 09:39 Сейчас в теме
(31) Спасибо за совет. Я уже делаю так в текущих разработках. Как руки дойдут - дополню статью примером исключительно на Perl.
33. MrWonder 574 04.05.18 10:52 Сейчас в теме
(32) Отвечу сам себе, почему такого примера не будет. В описанных выше примерах чтение файлов и последующая обработка выполняется в разных процессах, и ОС использует разные процессоры. На протестированном мной однофайловом решении (чтение и обработка в Perl) задействуется всего один процессор. Таким образом описанное решение работает быстрее однофайлового и полностью на Perl. Поэтому его здесь и не будет.
AlexandrSmith; CratosX; +2 Ответить
40. MrWonder 574 19.06.19 20:32 Сейчас в теме
(39) Большое спасибо за Ваш отзыв. Рад, что пригодилось O:-)
Оставьте свое сообщение

См. также

Мониторинг высоконагруженной системы 37

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad) Администрирование данных 1С

Высоконагруженной системе (более 8000 клиентских сессий) мониторинг необходим. Про опыт использования инструментов для мониторинга – самописной системы информирования, написанной на C#, и конфигурации «Центр контроля качества» в связке с системой отображения данных Grafana, на конференции Infostart Event 2018 Education рассказал Олег Репников.

13.09.2019    3337    Repich    4       

Использование Zabbix для сбора информации о серверных вызовах и управляемых блокировках с сервера 1С Предприятия, работающего на платформе GNU/Linux 72

Статья Системный администратор Программист Нет файла v8 Linux Бесплатно (free) Администрирование данных 1С Zabbix

Описанные в данном опусе механизмы ни в коей мере не противопоставляются тому, что реализует КИП от 1С или какие-либо другие инструменты (решения)! Это всего лишь еще один взгляд на "проблему", который может быть полезен в некоторых ситуациях.

10.09.2019    6805    Sloth    11       

Анализ производительности APDEX 65

Отчеты и формы Системный администратор Программист Внешний отчет (ert,erf) v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.

31.08.2019    2571    93    YPermitin    7       

Неочевидные проблемы производительности: важность системного подхода при анализе 50

Статья Программист Нет файла v8 Россия MS SQL Бесплатно (free) Производительность и оптимизация (HighLoad)

Часто программисты и 1С-ники сталкиваются с совершенно необъяснимыми на первый взгляд проблемами. Но это потому, что их внимание направлено только на один сегмент системы, а не на всю систему полностью. О том, почему нужно стараться смотреть на ситуацию комплексно, рассказал специалист по производительности компании SOFTPOINT Александр Денисов.

19.07.2019    4088    Филин    12       

Ловля блокировок на связке "Microsoft SQL server - 1С" 38

Статья Системный администратор Программист Нет файла v8 v8::blocking MS SQL Бесплатно (free) Производительность и оптимизация (HighLoad)

Материал относится к базам данных на связке «1С - MS SQL Server». Один из способов отлова блокировок в бд 1С . Переход к управляемым блокировкам через режим "Автоматический и управляемый".

16.07.2019    3446    fhqhelp    0       

Анти-оптимизация: как мы ускорили запрос в 4 раза, сделав его неоптимальным 57

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad) Практика программирования Решение задач на 1С:Специалист Разработка

В этой статье приведен пример неочевидной "оптимизации" запроса, которая противоречит всем правилам, описанным в книгах для подготовки к сертификации "1С:Эксперт по технологическим вопросам", а также преподаваемым на курсах подготовки экспертов.

02.07.2019    5906    igordynets    119       

Ускорение чтения правил обмена в УПП 1.3 в 20 раз! 66

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Способ оптимизации чтения правил обмена конвертации данных. Может понадобиться при большом размере правил и высокой периодичности обмена.

27.06.2019    4065    YPermitin    16       

Хотите снизить нагрузку на процессор сервера в 2 раза? 21

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

В статье рассмотрено влияние частого запуска регламентных заданий на процессор сервера 1С.

27.06.2019    4036    Дмитрий74Чел    6       

Непридуманные истории по оптимизации. История 1 77

Статья Системный администратор Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

Первая статья из планируемого цикла об оптимизации приложений на базе 1С. Без теории. Одна практика.

13.06.2019    6914    Repich    117       

Оптимизация: неэффективные запросы 6

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad) Практика программирования Разработка

В большинстве случаев основной причиной медленной работы системы при многопользовательском режиме работы является блокировка данных СУБД (говорим про клиент-серверную версию). Блокировка - это не есть хорошо или плохо, это жизненно необходимая вещь при построении прикладной логики работы системы. Но блокировки таблиц, записей могут быть как вполне законными, так и далеко не всегда оправданными в каждой конкретной ситуации. Одной из самых распространенных причин неоптимальной блокировки ресурсов является некорректное написание запросов.

13.06.2019    2577    slayer-ekb    10       

За 5 шагов добавляем мониторинг счетчиков производительности серверов MS SQL и 1С 90

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Статистика базы данных Производительность и оптимизация (HighLoad)

Мы расскажем и покажем, как добавить данные счетчиков производительности серверов 1С и MS SQL в нашу базу мониторинга за 15 минут. Приведем список наиболее важных из них, опишем основные особенности.

28.05.2019    6993    ivanov660    5       

Не думать о секундах свысока... 55

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Несколько примеров оптимизации типовой конфигурации УТ11. Описанные приемы подходят для многих других конфигураций.

21.05.2019    4303    vasilev2015    21       

Альтернативная стратегия управления блокировками 45

Статья Программист Архив с данными v8 v8::blocking 1cv8.cf Россия MS SQL Бесплатно (free) Производительность и оптимизация (HighLoad)

Данная публикация освещает одну из альтернативных стратегий блокирования данных на уровне MS SQL Server, которая недоступна средствами 1С, но может быть весьма полезной. Разбирается практический пример.

20.05.2019    3693    zhichkin    15       

Как работают управляемые блокировки 120

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Все типовые конфигурации содержат ошибки, потому как управляемые блокировки в 1С слишком уж "управляемые", при понижении уровня изоляции про некоторые "нюансы" просто забыли. Для создания и эксплуатации качественной системы, которая способна поддерживать транзакционную целостность данных при параллельной работе, информацию в этой статье желательно знать, хотя, конечно, ничего особо нового я не открыл.

29.04.2019    12975    comol    198       

Странное потребление места на диске С 33

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Решение проблемы постоянного роста папки %AppData%/Local/Temp.

26.04.2019    10542    kuzyara    12       

Включение встроенного в платформу механизма "Копии базы данных" и использование "Дата Акселератора". Новый стандартный механизм использования баз OLAP в 1С 49

Статья Системный администратор Программист Нет файла v8 Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

С версии 1С 8.3.14 в платформе появился новый функционал «Копии базы данных». В данной публикации я хочу рассказать, как включить использование данного механизма в платформе 1с и как его использовать для получения отчетов с копии базы данных, которая может быть вынесена на внешний сервер относительно текущей базы данных, а также как использовать систему «Дата акселератор», в которой база данных целиком размещена в оперативной памяти рабочего сервера кластера серверов «1С:Предприятия».

25.04.2019    8091    Elf1k    26       

5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С 201

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

В этой статье мы разберем механизм использования конфигурации "Анализ технологического журнала" на практике, и всего через 15 минут работы вы получите функциональный, удобный инструмент мониторинга проблем производительности базы 1С.

18.04.2019    17690    ivanov660    40       

Как разбить базу на файлы и не сойти с ума 108

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Разбиение базы данных 1C на файлы и последующее сопровождение. Нюансы, грабли и прочее.

06.04.2019    8541    YPermitin    29       

Как одно изменение конфигурации PostgreSQL улучшило производительность медленных запросов в 50 раз 124

Статья Системный администратор Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

В связи с санкциями и другими событиями сейчас все более и более актуальна тема перевода ПО компаний на отечественное и свободное программное обеспечение. Одной из самых востребанных СУБД на рынке на данный момент является PostgreSQL - надежная, высокопроизводительная и хорошо масштабируемая СУБД, которая является прямым конкуретном таким крупным компаниям с их топовыми продуктами, как Oracle, IBM и Microsoft. Однако каждый, кто переходит на PostgreSQL, сталкивается с трудностями, прежде всего с настройкой и производительностью. Не обошли проблемы с производительностью "слоника" и меня. Предлагаю вашему вниманию перевод статьи "How a single PostgreSQL config change improved slow query performance by 50x" автора Pavan Patibandla, которая мне помогла улучшить производительность PostgreSQL.

18.03.2019    9705    w.r.    23       

Простое программное решение проблем с блокировками SQL 17

Статья Системный администратор Программист Нет файла v8 v8::blocking 1cv8.cf Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

Описание одного из способов программного решения проблемы блокировок при проведении документов в клиент-серверной 1С.

06.03.2019    5787    dmitrydemenew    38       

Производительность сервера 1С и фоновые задания 63

Статья Системный администратор Нет файла v8 1cv8.cf Россия Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

В падении производительности сервера 1С зачастую виноваты не регламентные / фоновые задания, они выполняют полезную работу. Но задания нельзя оставлять «наедине» с базой.

05.02.2019    10634    user715208    38       

Новый режим реструктуризации (обновление базы данных на сервере в режиме v2) 168

Статья Системный администратор Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Данная статья скорее является заметкой и отчетом об успешном использовании нового механизма реструктуризации баз данных 1С. Актуально для больших баз данных.

31.10.2018    18181    Dach    46       

Нетривиальные подходы в решении всем известных проблем: ускорение «больших» документов в 1С и ускорение поиска по подстроке. Как добиться эффекта в разы? 62

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Часто у пользователей 1С поиск информации по большим спискам данных по подстроке занимает продолжительное время. Павел Баркетов рассматривает причины торможения запросов с поиском по подстроке и описывает возможности и подходы к их оптимизации и ускорению. Также в статье разобраны причины длительного проведения «больших» документов (более 10 000 строк) и даны рекомендации по ускорению этих операций.

30.08.2018    10715    gallam99    31       

Кейс: как мы разрабатывали систему автоматизации анализа ошибок, связанных со скоростью работы 1С 42

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Бурмистров Андрей рассказывает о создании инструмента по автоматизации анализа неоптимальных запросов в коде 1С. Он поднимает вопрос о предпосылках создания этого инструмента, рассказывает о возникших форс-мажорных ситуациях, с которыми столкнулась команда в процессе разработки, и о том, как они с ними справлялись.

27.08.2018    7418    Andreynikus    20       

3000 пользователей на трехъядерном Athlon – сверхтонкий веб-клиент для 1С 97

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Юрий Лазаренко поделится опытом ускорения 1С нестандартными методами, в том числе с помощью http-сервисов. Он расскажет, как с помощью сверхтонкого клиента для 1С и интеграции с сайтом удалось добиться ускорения 1С на порядок. Также в статье приведена статистика по отчету о нагрузочном тестировании сверхтонкого клиента для 1С:ITIL.

16.08.2018    11217    TitanLuchs    28       

Когда условие в срезе последних даже вредит 20

Статья Системный администратор Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Спойлер: оптимизатор MSSQL видит внешние, по отношению к срезу, условия, и строит план с их учетом.

05.08.2018    7661    nicxxx    105       

Оптимизация без оптимизации: как мы ускорили 1С в 10 раз без трудоемкой оптимизации запросов и алгоритмов. Практический опыт 80

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Можно ли ускорить 1С, не оптимизируя запросы, не разбивая транзакции и не наращивая оборудование? В статье Аверьянова Алексея рассмотрены три практических кейса повышения производительности системы без трудоемкой оптимизации: отложенное резервирование «в один поток», отложенное создание и проведение реализаций.

26.07.2018    13038    avryanovalexey    100       

Альтернативные технологии нагрузочного тестирования серверной части кода прикладных решений на платформе 1С 56

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Евгений Филиппов знакомит с альтернативными технологиями нагрузочного тестирования серверной части кода прикладных решений на платформе 1С. Он рассказывает об узких местах традиционной технологии нагрузочного тестирования и методах их обхода путем переноса работы с клиентских соединений на фоновые задания и изменения способа управления сеансами. Также автор приводит примеры с реальных проектов, подтверждающие жизнеспособность предложенных технологий.

12.07.2018    8118    jf2000    10       

Архитектура ИТ-системы на базе 1С в крупной организации. Часть 2. Чудес не бывает 81

Статья Системный администратор Нет файла v8 УТ11 Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

Развернуто отвечаю, как мы боремся с зависаниями системы и вообще решаем проблемы. С примерами, но без слайдов.

04.07.2018    12101    Repich    74       

Архитектура ИТ-системы на базе 1С в крупной организации 101

Статья Системный администратор Нет файла v8 УТ11 Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

В данной статье я хотел бы очень крупными мазками обрисовать архитектуру ИТ системы на базе 1С в крупных (более 1 тысячи пользователей) организациях. Она не несет какой либо образовательной цели, это просто попытка показать – «а как у нас».

02.07.2018    14611    Repich    112       

Взгляд на ошибки и платформу через призму HI-Load 52

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Поговорим об ошибках в целом и их влиянии на Hi-Load системы в частности. Может ли тут помочь платформа 1С? (да и должна ли в принципе?) Немного про сам Hi-Load на примере крупной БД. PS Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2017 COMMUNITY.

18.06.2018    9890    Sergey.Noskov    27       

Простые регулярные выражения 59

Статья Программист Архив с данными v8 Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

Шпаргалка к экзамену "Эксперт по технологическим вопросам".

30.04.2018    11593    3    vasilev2015    30       

Неоптимальная работа запроса 128

Статья Программист Нет файла v8::Запросы Бесплатно (free) Производительность и оптимизация (HighLoad)

Шпаргалка к экзамену "Эксперт по технологическим вопросам".

27.04.2018    16901    vasilev2015    32       

Неоптимальности вида «план исполнения запроса "испортился"» - поиск и исправление 69

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

Рассматривается один из частых типов проблем в рабочих базах (второй после блокировок, пожалуй... впрочем, часто и тесно с ними связанный). Материал относится к базам данных на связке «1С - MS SQL Server».

05.02.2018    13659    fhqhelp    20       

Пример поиска неоптимальности при загрузке SQL-сервера по CPU на 100% 83

Статья Системный администратор Программист Нет файла v8 1cv8.cf Россия Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

Вечер пятницы, ничто не предвещало.. Звонок из техподдержки: "центральная база розничной сети лежит". Далее расследование причин.

23.12.2017    15182    fhqhelp    32       

Вопросы разработки, анализа производительности и оптимизации приложений 1С под управлением СУБД ORACLE 16

Статья Системный администратор Программист Нет файла v8 Oracle Бесплатно (free) Производительность и оптимизация (HighLoad)

Я являюсь сотрудником Комсомольского-на-Амуре филиала компании «Сухой». Наше предприятие производит боевую авиационную технику и комплектующие для гражданской авиационной техники. В статье я вам расскажу про свой опыт работы со связкой 1С и СУБД ORACLE.

05.09.2017    10395    user597755_vices2015    2       

Оптимизируй это! Или MS SQL и Экспертный подход творят чудеса! 207

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

В статье речь пойдет про взаимодействие сервера 1С с MS SQL. Мы очень часто слышим, как важно оптимизировать все критические участки системы заблаговременно, в плановом режиме, как надо, «от и до» во всех деталях. Но в реальной жизни бывает по-другому. Очень часто клиенты обращаются к нам, когда система уже не дает работать: «спасите, помогите, болит очень сильно, надо решать». Об одном из таких случаев я и хотел бы вам сегодня рассказать.

11.07.2017    28866    R.Tsarenko    32       

Планы запросов - это просто! 290

Статья Программист Нет файла v8::Запросы Бесплатно (free) Производительность и оптимизация (HighLoad)

Наверное, каждый 1С-ник задавался вопросом "что быстрее, соединение или условие в ГДЕ?" или, например, "сделать вложенный запрос или поставить оператор В()"? В данной статье я не дам вам исчерпывающих инструкций по чтению планов запроса. Но я постараюсь объяснить доходчиво - что это такое и с какой стороны к ним подойти.

04.07.2017    30991    Evil Beaver    58       

PostgreSQL на Windows – реальная альтернатива для высоконагруженных систем на базе 1С 157

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Многие интересуются PostgreSQL, но не знают, насколько хорошо будет она работать с уже существующими системами. «Инфософт» - одна из первых компаний, кто опробовал PostgreSQL на Windows. О своем опыте перехода рассказывает руководитель отдела информационных технологий компании.      

23.06.2017    37045    a.doroshkevich    113       

Ускорение в 100 раз. Решаем проблему блокировок 328

Статья Программист Нет файла v8 v8::УФ 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Я являюсь автором и тренером курсов по оптимизации и повышению производительности в 1С. Большинство людей приходят ко мне на обучение, желая разобраться со своими проблемами, и я очень часто слышу от них: «эти блокировки замучили, достали, жизни нет, что делать – не знаем. Технологический журнал включали, галочки ставили, форумы читали – ничего не помогает». Я уверен, что эта тема актуальна для многих из вас, поэтому в статье, не вдаваясь глубоко в подробности, я хочу вам дать некоторые конкретные рекомендации, которые вы сможете применить у себя и сразу получить ощутимый эффект. Например, если у вас запрос из-за блокировок выполняется 15 секунд, то после оптимизации он начнет выполняться за 15 миллисекунд. Это обычная практика, никакой фантастики – все это можно сделать.

13.06.2017    59950    Andreynikus    34       

Настройка зеркалирования базы для MS SQL 55

Статья Системный администратор Программист Нет файла v8 1cv8.cf Бесплатно (free) Архивирование (backup) Производительность и оптимизация (HighLoad)

Очень удобный способ, когда нам нужна не просто резервная копия, а "горячая" замена серверов.

19.05.2017    23695    MsDjuice    13