Довідковий матеріал

Елемент <leaks>

Описано налаштування елементів <leaks>, <mem>, <ftextupd> і <query> у файлі logcfg.xml: відстеження витоків пам'яті, формування подій технологічного журналу та контрольні точки коду.. Елемент <mem>. Елемент <ftextupd>. Елемент <query>

Світні блоки даних у замкненому контурі між двома контрольними точками, поруч — акуратно виділений незавершений слід витоку пам’яті.

Елемент <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> відсутній у файлі – інформація про поля не збирається.
Записатися телефоном