Элемент <leaks>
Описаны настройки элементов <leaks>, <mem>, <ftextupd> и <query> в файле logcfg.xml: отслеживание утечек памяти, формирование событий технологического журнала и контрольные точки кода.. Элемент <mem>. Элемент <ftextupd>. Элемент <query>
Элемент <leaks> настраивает отслеживание утечек памяти, вызванных проблемами в коде решения. По умолчанию отслеживание утечек отключено и не влияет на производительность системы.
Чтобы включить сбор данных об утечках памяти, в файле logcfg.xml следует добавить элемент <leaks>: <leaks collect= "1"> или <leaks collect= "true">.
Чтобы отключить отслеживание утечек памяти, следует изменить элемент <leaks>: <leaks collect="0"> или <leaks collect="false">.
Если отслеживание утечек включено, в разрезе пользователей контролируются создание и удаление следующих объектов:
- Form/Форма,
- ManagedForm/УправляемаяФорма,
- FixedStructure/ФиксированнаяСтруктура,
- FixedMap/ФиксированноеСоответствие,
- FormDataStructure/ДанныеФормыСтруктура,
- FormDataCollection/ДанныеФормыКоллекция,
- FormDataStructureAndCollection/ДанныеФормыСтруктураСКоллекцией,
- FormDataCollectionItem/ДанныеФормыЭлементКоллекции,
- FormDataTree/ДанныеФормыДерево,
- FormDataTreeItemCollection/ДанныеФормыКоллекцияЭлементовДерева,
- FormDataTreeItem/ДанныеФормыЭлементДерева,
- AccountingRegisterManager/РегистрБухгалтерииМенеджер,
- AccountingRegisterRecordSet/РегистрБухгалтерииНаборЗаписей,
- ChartOfAccountsManager/ПланСчетовМенеджер,
- ChartOfAccountsObject/ПланСчетовОбъект,
- ExchangePlanManager/ПланОбменаМенеджер,
- ExchangePlanObject/ПланОбменаОбъект,
- SettingsStoragesManager/ХранилищаНастроекМенеджер,
- AccumulationRegisterManager/РегистрНакопленияМенеджер,
- AccumulationRegisterRecordSet/РегистрНакопленияНаборЗаписей,
- ChartOfCharacteristicTypesManager/ПланВидовХарактеристикМенеджер,
- ChartOfCharacteristicTypesObject/ПланВидовХарактеристикОбъект,
- ConstantManager/КонстантаМенеджер,
- DocumentManager/ДокументМенеджер,
- DocumentObject/ДокументОбъект,
- EnumManager/ПеречислениеМенеджер,
- ExternalDataProcessor/ВнешняяОбработка,
- ExternalRepor/ВнешнийОтчетt,
- InformationRegisterManager/РегистрСведенийМенеджер,
- InformationRegisterRecordSet/РегистрСведенийНаборЗаписей,
- DataProcessorManager/ОбработкаМенеджер,
- DataProcessor/Обработка,
- CatalogManager/СправочникМенеджер,
- CatalogObject/СправочникОбъект,
- ReportManager/ОтчетМенеджер,
- Report/Отчет,
- SequenceRecordSet/ПоследовательностьНаборЗаписей,
- BusinessProcessManager/БизнесПроцессМенеджер,
- BusinessProcessObject/БизнесПроцессОбъект,
- TaskManager/ЗадачаМенеджер,
- TaskObject/ЗадачаОбъект,
- ChartOfCalculationTypesManager/ПланВидовРасчетаМенеджер,
- ChartOfCalculationTypesObject/ПланВидовРасчетаОбъект,
- CalculationRegisterManager/РегистрРасчетаМенеджер,
- CalculationRegisterRecordSet/РегистрРасчетаНаборЗаписей,
- RecalculationRecordSet/ПерерасчетНаборЗаписей,
- COMSafeArray,
- KeyAndValue/КлючИЗначение,
- Array/Массив,
- FixedArray/ФиксированныйМассив,
- Map/Соответствие,
- Structure/Структура,
- ValueListItem/ЭлементСпискаЗначений,
- ValueList/СписокЗначений,
- ValueTable/ТаблицаЗначений,
- ValueTableRow/СтрокаТаблицыЗначений,
- ValueTree/ДеревоЗначений,
- ValueTreeRow/СтрокаДереваЗначений.
Утечки отслеживаются между начальной и конечной контрольными точками кода. В начальной контрольной точке очищаются данные об утечках для текущего пользователя. В конечной контрольной точке формируется и выводится в технологический журнал событие LEAKS, в котором для каждого неосвобожденного экземпляра объекта указывается стек встроенного языка на момент его создания.
Контрольными точками могут быть:
- начало и конец выполнения встроенного языка на клиенте или сервере;
- вызов процедуры/функции встроенного языка и возврат из процедуры/функции;
- начало выполнения одной строки кода встроенного языка и завершение выполнения другой строки кода встроенного языка.
Начальную и конечную контрольные точки определяет элемент <point>. Вложение контрольных точек друг в друга возможно, но игнорируется — утечки подсчитываются только по внешним контрольным точкам. Например, если при выполнении кода конфигурации были пройдены контрольные точки Начальная1, Начальная2, Конечная1, Конечная2, то утечки будут отслеживаться между точками Начальная1 и Конечная2.
Элемент <point> может иметь один из следующих форматов:
<point call="client"/>, <point call="server"/>
Определяет контрольные точки в начале и в конце выполнения встроенного языка на клиенте или сервере, то есть начальная точка будет установлена до начала выполнения встроенного языка на сервере/клиенте, а конечная — в конце выполнения встроенного языка на сервере/клиенте.
<proc="<ИмяМодуля>/<ИмяМетода>"/>
Определяет контрольные точки при вызове и возврате из указанного метода встроенного языка. <ИмяМодуля> содержит полное имя объекта метаданных, которому принадлежит модуль, без названия конфигурации. В таком же формате имена модулей отображает отладчик. <ИмяМетода> содержит название метода. Если аргумент <ИмяМетода> не установлен, контрольные точки будут определены в начале и после завершения выполнения тела модуля. Примеры имен модулей:
- SessionModule.Module (МодульСеанса.Модуль) – модуль сеанса;
- OrdinaryApplicationModule.Module (МодульПриложения.Модуль) – модуль обычного приложения;
- ManagedApplicationModule.Module (МодульУправляемогоПриложения.Модуль) – модуль управляемого приложения;
- ExternalConnectionModule.Module (МодульВнешнегоСоединения.Модуль) – модуль внешнего соединения;
- CommonModule.Global.Module (ОбщийМодуль.Глобальный.Модуль) – общий модуль Global/Глобальный;
- Catalog.Clients.ObjectModule (Справочник.Контрагенты.МодульОбъекта) – модуль элемента справочника Clients/Контрагенты;
- DataProcessor.DataProcessor1.Form.Form1.Module (Обработка.Обработка1.Форма.Форма1.Форма) – модуль формы Form1/Форма1 обработки DataProcessor1/Обработка1;
- DataProcessor.DataProcessor2.Form.DefaultForm.Module (Обработка.Обработка2.Форма.ОсновнаяФорма.Форма) – модуль формы DefaultForm/ОсновнаяФорма обработки DataProcessor2/Обработка2.
<point on="<ИмяМодуля>/<НомерСтроки>" Off="<ИмяМодуля>/<НомерСтроки>"/>
Определяет начальную и конечную контрольные точки явным указанием строк кода. Начальная контрольная точка соответствует началу выполнения кода строки, указанной в атрибуте On. Конечная контрольная точка соответствует завершению выполнения кода строки, указанной в атрибуте Off. Нумерация строк начинается с 1. Если начальная контрольная точка достигнута на сервере, то и конечная контрольная точка должна быть достигнута на сервере. Конечной контрольной точкой не может быть последняя строка кода процедуры, функции или тела модуля.
Пример элемента <leaks>:
<leaks collect="1">
<point call="client"/>
<point call="server"/>
<point proc="OrdinaryApplicationModule/"/>
<point proc="CommonModule.ConnectProcessing.Module/AtServerNoLeaks"/>
<point on="CommonModule.Services.Module/9" off="CommonModule.Services.Module/11"/>
</leaks>
В этом примере сбор данных об утечках включен. Контрольные точки установлены:
- в начале и в конце выполнения встроенного языка на клиенте;
- в начале и в конце выполнения встроенного языка на сервере;
- в начале и после завершения выполнения тела модуля приложения;
- при вызове и возврате из метода AtServerNoLeaks()/НаСервереБезУтечки() общего модуля ConnectProcessing/ОбработкаПодключений;
- на девятой и одиннадцатой строках общего модуля Services/Сервисы.
Предположим, процедура с таким текстом вызывает утечку памяти:
Процедура НаСервереСУтечкой() Экспорт
М=НовыйМассив;
М.Добавить(НовыйМассив);
М[0].Добавить(НовыйМассив);
М[0][0].Добавить(М);
КонецПроцедуры
Чтобы ее обнаружить, можно включить отслеживание утечек в технологическом журнале с помощью следующей конфигурации:
<config xmlns="http://bas-soft.eu/v8/tech-log">
<log location="C:\BAS\logs" history="24">
<event>
<eq property="name" value="call"/>
</event>
<event>
<eq property="name" value="leaks"/>
</event>
<property name="all">
</property>
</log>
<leaks collect="1">
<point call="server"/>
</leaks>
</config>
Тогда при вызове сервера или выполнении регламентного задания, если утечки не происходит, фрагмент технологического журнала будет иметь следующий вид:
59:44.4562-2840,CALL,5,process=rphost,p:processName=t76346,t:clientID=428,t:applicationName=JobScheduler,Func=Execute,Module=CommonModule2,Meth=РегламентноеЗаданиеБезУтечки 59:49.4581-2700,CALL,5,process=rphost,p:processName=t76346,t:clientID=430,t:applicationName=JobScheduler,Func=Execute,Module=CommonModule2,Meth=РегламентноеЗаданиеБезУтечки
А если утечка происходит, то такой:
59:48.4768-2885,CALL,5,process=rphost,p:processName=t76346,t:clientID=429,t:applicationName=JobScheduler,Func=Execute,Module=CommonModule2,Meth=РегламентноеЗаданиеСУтечкой 59:48.4769-0,LEAKS,5,process=rphost,Descr=' Array: ОбщийМодуль.CommonModule2:2:НаСервереСУтечкой(); ОбщийМодуль.CommonModule1:4:М[0].Добавить(НовыйМассив); Array: ОбщийМодуль.CommonModule2:2:НаСервереСУтечкой(); ОбщийМодуль.CommonModule1:2:М=НовыйМассив; Array: ОбщийМодуль.CommonModule2:2:НаСервереСУтечкой(); ОбщийМодуль.CommonModule1:3:М.Добавить(НовыйМассив);
В приведенном фрагменте при выполнении регламентного задания (t:applicationName=JobScheduler, Func=Execute) метода РегламентноеЗаданиеСУтечкой() модуля CommonModule2 были созданы и не освобождены три объекта Array (Массив). При этом указаны стеки вызовов встроенного языка на момент создания каждого из объектов.
Элемент <mem>
Если элемент <mem> присутствует, процессы сервера BAF подсчитывают:
- количество выделенных и не освобожденных фрагментов памяти;
- суммарный объем выделенных и не освобожденных фрагментов памяти.
Если между моментами времени, когда процесс сервера не выполнял ни одного вызова и ни одного регламентного задания, увеличилось количество выделенных, но не освобожденных фрагментов памяти, формируется событие типа MEM со следующими свойствами:
- sz – общий объем выделенных процессом, но не освобожденных фрагментов памяти;
- szd – его изменение с момента вывода предыдущего события MEM;
- cn – общее количество выделенных процессом, но не освобожденных фрагментов памяти;
- cnd – его изменение с момента вывода предыдущего события MEM.
Длительность события MEM равна промежутку времени между последним и предпоследним моментами, когда процесс сервера не выполнял ни одного вызова и ни одного регламентного задания. Именно в течение этого времени увеличилось количество занятых процессом фрагментов памяти.
ВНИМАНИЕ!
Указание элемента <mem> в конфигурационном файле технологического журнала несколько снижает производительность системы, особенно при параллельной работе нескольких пользователей.
Например, при такой конфигурации объем распределенной памяти не собирается, а события MEM не выводятся:
<config xmlns="http://bas-soft.eu/v8/tech-log">
<log location="C:\bas\logs" history="24">
<event>
<eq property="name" value="mem"/>
</event>
<property name="all"/>
</log>
</config>
Следующая конфигурация технологического журнала собирает объем распределенной памяти и в случае его увеличения выводит события MEM:
<config xmlns=«http://bas-soft.eu/v8/tech-log">
<log location="C:\bas\logs" history="24">
<event>
<eq property="name" value="mem"/>
</event>
<property name="all"/>
</log>
<mem/>
</config>
Элемент <ftextupd>
Элемент <ftextupd> включает формирование расширенной информации о процессе обновления индексов полнотекстового поиска (событие FTETXUpd). Если элемент отсутствует в файле, расширенная информация не включается в технологический журнал.
Атрибуты элемента:
Атрибут logfiles
Наличие расширенной информации в событии FTEXTUpd:
- 0 (false) – не включать;
- 1 (true) – включать.
Элемент <query>
Элемент <query> управляет внесением в технологический журнал информации о полях, содержащих NULL при выполнении запроса к внешнему источнику данных, но для которых такое значение не допускается (событие QERR). Включение такого отслеживания может существенно снизить скорость выполнения запросов.
Атрибуты элемента:
Атрибут checkActualNullable
Управляет сбором информации:
- 1 (true) – информация о полях будет собираться.
- 0 (false) или элемент <query> отсутствует в файле – информация о полях не собирается.