gilev.ru

 

       Утечки памяти (memory leak)


Куда утекает память?

Никуда она не утекает, просто неудачный термин. Правильнее говорить об «отложении» или «пластовании» ресурсов, по аналогии с осадочными слоями.

 

Утечка памяти ( memory leak) - это процесс неконтролируемого уменьшения объёма свободной RAM ) , связанный с ошибками в работающих программах, вовремя не освобождающих ненужные уже участки памяти, или с ошибками системных служб контроля памяти. (Википедия)

 

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

 

Фрагментация адресного пространства (external fragmentation). При интенсивном выделении и освобождении памяти может возникнуть ситуация, когда непрерывный блок памяти определенного размера не может быть выделен, хотя суммарный объем свободной памяти вполне достаточен. Это происходит, если используемые блоки памяти чередуются со свободными блоками и размер любого из свободных блоков меньше, чем нам нужно. Проблема особенно критична в серверных приложениях, работающих в течение длительного времени.

Для дефграментации памяти используют чаще всего используют системные утилиты.

Классификация утечек применительно к 1С:Предприятие

  1. По логическому источнику
    • В результате ошибок механизма платформы - могут исправить только в 1С
    • Созданы логикой кода конфигурации - может исправить 1С-специалист
  2. По архитектуре
    • На клиенте 1С:Предприятие
    • На сервере
      • – В рабочем процессе rphost
      • – Системные сервисы (ragent, rmngr)

Симптомы

  1. Падения платформы, разрыв соединения с сервером падение платформы
    (однако причины данной ошибки могут разниться, подробней здесь)
  2. Не выгружается dt
  3. Необъяснимы рост занимаемой памяти процессами 1С
    утечка

Причины

  • Результат неправильного управления памятью (ошибки программирования), наиболее подвержены приложения на "неуправляемом" коде, в том числе 1С:Предприятие
  • Недостаточно доступной памяти. Адресное пространство процесса небезгранично и на 32-битных платформах по умолчанию составляет чуть менее 2 Гб
  • Ошибки в коде конфигурации
    • Циклические ссылки - взаимный вызов процедур и объектов
    • Не верное размещение объявлений видимости переменных и объектов
  • "Псевдо-утечки" - по существу, не являются утечками, но могут вызывать некоторое беспокойство, если вы не понимаете, куда расходуется ваша память

Способы лечения

  1. Заблаговременная подготовка
    • до максимума увеличить объем памяти
    • перейти на 64-битную платформу 1С:Предприятие
  2. По факту
    • Перейти на актуальный релиз платформы
    • Рестартовать службу или перезагрузить сервер
    • Собрать наиболее полную информацию в технологическом журнале и дампах при падениях rphost и выслать в службу технической поддержки
    • Выполнить оптимизацию кода и запросов

Ошибка, исправленная в 11м релизе платформы

Ошибка, исправленная при выпуске версии 8.1.11.67 № 00101847 

Утечка памяти серверных процессов.

Проблема: При многочисленных установках и разрывах клиентских соединений с кластером серверов возможна утечка памяти в процессах rmngr и rphost.

Дата публикации: 2008-02-15

 

Возможности 12го релиза платформы анализа утечек

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

Для того чтобы включить сбор данных об утечках в файле logcfg.xml следует добавить элемент <leaks>:

<leaks Collect=1> или <leaks Collect=True>.

Приведем пример элемента <leaks>.

<leaks Collect=1>

<point Call=”client”/>

<point Сall="server"/>

<point Proc="МодульПриложения/"/>

<point Proc="ОбщийМодуль.ОбработкаПодключений/НаСервереБезУтечки"/>

<point On="ОбщийМодуль.Сервисы /9" Off="ОбщийМодуль.Сервисы /11"/>

</leaks>

В данном случае сбор данных об утечках включен. Контрольные точки установлены:

·       в начале и в конце исполнения встроенного языка на клиенте,

·       в начале и в конце исполнения встроенного языка на сервере;

·       в начале и при окончании исполнения тела модуля приложения;

·       при вызове и возврате метода НаСервереБезУтечки() из общего модуля ОбработкаПодключений;

·       на девятой и одиннадцатой строках общего модуля Сервисы.

Пример файла настроек технологического журнала для сбора утечек на сервере для 12го релиза (в нем надо server заменить на client).

Также в релизе 8.1.12 исправлены несколько ошибок в платформе, приводившие к небольшим утечкам памяти.

Взаимосвязь утечек с надежностью (качеством) решения

В 1973 году Ф. Локвуд Моррис [2] воспользовался выражением «заслуживающее доверия программное обеспечение» (trustworthy software) "продукт заслуживает доверия, если считаем, что вероятность наличия в нем изъяна, потенциально ведущего к существенным потерям, приемлемо низка".

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

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

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

P.S. Подробней о технологическом журнале здесь.

 

Смотрите также похожий материал:

1С 8.1: Неопознанная ошибка HRESULT=80004005 или почему не выгружаются базы данных в dt

Лечим 54ю ошибку в 1С

 

Отзывы присылайте на e-mail: gilev_slava@mail.ru

 

Перейти к другим материалам сайта

 

© Гилёв Вячеслав, 2004-2009
email: gilev_slava @ mail.ru