Заметки из Зазеркалья

02.09.2016

Развитие средств диагностики

Реализовано в версии 8.3.10.2168.

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

Поиск циклических ссылок

В платформе 1С:Предприятие 8 используется стратегия управления временем жизни объектов, основанная на подсчете ссылок на объекты - reference counting. Данная стратегия заключается в следующем. Каждый объект платформы содержит счетчик ссылок. При появлении ссылки на объект (когда объект присваивается какой-либо переменной) происходит увеличение счетчика на единицу, при уничтожении подобной ссылки - значение счетчика на единицу уменьшается. Когда счетчик ссылок объекта становится равен нулю, объект автоматически уничтожается, и память, занимаемая им, освобождается.

Особенностью подсчета ссылок на объекты является возможность организации циклической ссылки. Циклическая ссылка возникает, когда объекты начинают ссылаться друг на друга. Например, если есть объекты, внутри которых вложены другие объекты, и где-то в глубине они ссылаются на самый верхний объект. В результате образуется циклическая ссылка. В самом упрощённом виде циклическая ссылка может быть получена следующим образом:

Данные = Новый Структура;  
Данные.Вставить("Ключ", Данные);

Отрицательной стороной циклических ссылок является то, что ни один из объектов, участвующих в циклической ссылке, не будет уничтожен. А это является причиной возникновения утечек памяти (memory leaks).

Если циклические ссылки накапливаются в течение длительной работы, то это может приводить, например, к тому, что рабочий процесс кластера серверов занимает всю оперативную память, или достигает порога перезапуска. Другим проявлением длительного накапливания циклических ссылок может являться то, что сеансовые данные занимают все место на диске, на котором расположено хранилище.

Мы разработали два инструмента, которые помогут вам обнаруживать циклические ссылки. Мы рекомендуем использовать их только в период отладки и тестирования, потому что они требуют значительных ресурсов, что может негативно сказаться на выполнении операций 1С:Предприятия.

Автоматический поиск циклических ссылок

Прежде всего, мы реализовали автоматический режим поиска циклических ссылок. В этом режиме при обнаружении циклической ссылки платформа остановит выполнение программного кода и выдаст диалог, например, следующего вида:

01.png

В этом диалоге будут перечислены все переменные, для которых обнаружено зацикливание. И для каждой переменной будут перечислены (в терминах встроенного языка) все циклы, в которых она участвует.

В данном случае к зацикливанию привёл такой фрагмент кода:

03.png

Этот режим вы можете включить разными способами, например:

  • в параметрах командной строки;
  • в параметрах запуска в конфигураторе;
  • в конфигурационном файле conf.cfg.

02.png

Также режим автоматического поиска циклических ссылок можно включить и в настройках технологического журнала. Но в этом случае исполнение программного кода останавливаться не будет, а вся обнаруженная информация будет собираться в технологический журнал, в новое событие SCRIPTCIRCREFS.

Поиск циклических ссылок из встроенного языка

Для более тонкой и точной диагностики наличия циклических ссылок мы реализовали новый метод глобального контекста ПроверитьЦиклическиеСсылкиВстроенногоЯзыка(). С его помощью вы можете найти циклические ссылки, например, в нужный вам момент, или в той процедуре, которая вас интересует, или проанализировать ту переменную, которая вызывает у вас подозрение.

Если вы не указываете параметры этого метода, то будут проанализированы все локальные переменные на стеке. Если вы передаёте в метод локальную переменную, то будет проанализирована только она.

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

Отслеживание получения и освобождения лицензий

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

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

Попытки получения лицензий

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

При этом, если используются HASP ключи, логируется и процесс их инициализации. Фиксируется вид запрашиваемой лицензии и список доступных HASP ключей.

Освобождение лицензий

При каждом освобождении лицензии записывается информация об идентификаторе, времени, в которое был создан объект освобождаемой лицензии, получателе лицензии, виде лицензии или о ключе, а также данные о количестве занятых программных лицензий.

Проверка неизменности параметров, критичных для лицензирования

Мы реализовали периодическую (через 20 минут) проверку неизменности параметров компьютера, критичных для привязки программных лицензий. Если обнаруживается критическое изменение этих параметров, то в технологический журнал записывается событие LIC. Оно содержит информацию об имени файла лицензии, регистрационный номер, пин-код, вид лицензии, максимальное количество пользователей и список критичных изменений в оборудовании.

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


Теги: разработка  8.3.10