Для получения top 25 вызовов в клиент-серверном режиме работы с наибольшей суммарной длительностью необходимо:
Перед применением инструкции рекомендуется ознакомиться с разделом методики "Методики / Мониторинг на продукционных серверах".
Настройка технологического журнала.
Настраиваем сбор событий CALL в технологическом журнале. Например, файл logcfg.xml
Копировать в буфер обмена<?xml version="1.0" encoding="UTF-8"?> <config xmlns="http://v8.1c.ru/v8/tech-log"> <log location="C:\LOGS\CALL" history="12"> <event> <eq property="Name" value="CALL"/> </event> <property name="all"/> </log> </config>
Анализ полученных данных.
Видим, что события CALL фиксируются в журнале в формате
Копировать в буфер обмена59:59.589001-30966,CALL,1,process=rphost,p:processName=base1,t:clientID=107,t:applicationName=WebServerExtension,t:computerName=server1,t:connectID=103742,SessionID=290896, Context=ОбщийМодуль.Вызов : ОбщийМодуль.СоединенияИБВызовСервера.Модуль.ПараметрыБлокировкиСеансов,Interface=bc15bd01-10bf-413c-a856-ddc907fcd123,Method=0, CallID=1753280059,Memory=923,MemoryPeak=35266,InBytes=0,OutBytes=0
Выполняем в cygwin
Копировать в буфер обмена$ cat rphost*/*.log | perl call.pl | awk -F'-' '{duration[$2]+=$1; count[$2]+=1;} END {for (i in duration) {print "SumDuration=" duration[i]/1000000 " sec; \tAvgDuration=" duration[i]/count[i]/1000000 " sec; \tNumb=" count[i] "; \t" i}}' | sort -rnb | head -n 25
Используем 1000000 для 8.3 и 10000 для 8.2
Обращаем внимание на использование call.pl. Его листинг: Копировать в буфер обмена#!/usr/bin/perl use strict; my $event; my %actions = ( 'CALL' => [ { 'action' => sub { my ($event) =@_; my ($date, $garbage) = split /,CALL/, $event; $date =~ s/\d\d:\d\d\.\d+-//g; my ($garbage, $context) = split /Context=/, $event; my ($context, $garbage) = split /,Interface=/, $context; if ($context =~ /\n/) { my @mlc = split /\n/, $context; $context = $mlc[$#mlc]; } print "$date-$context\n" if $context; }, }, ], ); print "\n"; while (<>) { $event=process_event($event) if /^\d\d:\d\d\.\d+/; $event .= $_; } sub process_event($) { my ($event) = @_; return unless $event; foreach my $event_type ( keys %actions ) { next unless $event =~ /^[^,]+,$event_type,/; foreach my $issue ( @{ $actions{$event_type} }) { &{$issue->{action}}($event); } } }
Получаем результат вида (всего 25 строк):
Копировать в буфер обменаSumDuration=98.9029 sec; AvgDuration=2.15006 sec; Numb=46; Система.ПолучитьФорму : Отчет.ОтчетПоПроводкам.Форма.ФормаОтчета SumDuration=97.9661 sec; AvgDuration=5.76271 sec; Numb=17; Форма.Вызов : Обработка.ЗакрытиеМесяца.Форма.Форма.Модуль.ПриИзмененииОрганизации SumDuration=96.9744 sec; AvgDuration=0.718329 sec; Numb=135; Система.ПолучитьФорму : Документ.СчетНаОплатуПокупателю.ФормаСписка SumDuration=94.1614 sec; AvgDuration=0.350043 sec; Numb=269; Система.ПолучитьФорму : Документ.РасходныйКассовыйОрдер.ФормаОбъекта ...Здесь
SumDuration - суммарная длительность вызовов в секундах
AvgDuration - средня длительность вызовов в секундахNumb - число вызовов
Группировка работает только для тех CALL, у которых в технологическом журнале есть контекст на встроенном языке.Теперь мы видим, какие именно вызовы были наиболее длительными. Далее необходимо понять, насколько длительные вызовы пересекаются с нашим текущим списком ключевых операций и принять решение о необходимости их анализа и оптимизации.