Имя: Пароль:
1C
1С v8
Утекает память при записи объектов справочника
0 demiurggig
 
26.12.18
11:25
Запустил небольшую обработку в УТ 10.2, которая меняет ставку НДС. Надо поменять значения ставок у 57 000 элементов.

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Код, Ссылка КАК Номенклатура, СтавкаНДС
    |ИЗ Справочник.Номенклатура
    |ГДЕ
    |    СтавкаНДС В(ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18),ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18_118))";
    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
        Попытка
            объ = Выборка.Номенклатура.ПолучитьОбъект();
            объ.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
            объ.Записать();
        Исключение
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры


Наблюдаю за процессом выполнения задачи в диспетчере задач, и замечаю, что память у процесса 1С плавно утекает.
Вот какие изменения произошли всего за 1 минуту.

https://hostingkartinok.com/show-image.php?id=d3c6f26d73438df566391d5cbf5f9782

https://hostingkartinok.com/show-image.php?id=4474c8295e13e0e666c91c27d2409efd

Немного беспокоит этот процесс. Подскажите, может что не так в обработке?
1 demiurggig
 
26.12.18
11:27
0+ Я так понимаю в 1С мы не должны сами уничтожать объект, система делает это сама?
2 polosov
 
26.12.18
11:35
(0) С чего ты взял, что память утекает?
Ты получаешь объект, он кешируется. Но т.к. переменная с  объектом переиницаилизируется в цикле, то через какое-то время память будет освобождена. Этим уже занимается специальный менеджер.
3 Buster007
 
26.12.18
11:37
(2) в зависимости от версии платформы
4 palsergeich
 
26.12.18
11:41
10 мб всего, не там вы фрицев ищете.
Это кеш объектов.
Если платформа нормальная - сам почистится.
5 ProxyInspector
 
26.12.18
11:42
Все нормально. Эта такая логика заложена в 1С.
В 1с плохо организовано кеширование. Судя по всему кеш рассчитан на определенное количество элементов. 1С пишет этот кеш по кругу. Поэтому стандартное поведение 1С - это когда Тонкий клиент/Клиент отъедает до 200 мб памяти а потом рост прекращается. Освобождать память 1С не умеет.
  При этом размер элемента может быть различным. И отъедать может и больше 200 мб.
  Есть одна тонкость, если объекты конфигурации написаны криво. Например в модуле объекта используется конструкция типа
  Перем Форма  = ЭтаФорма Экспорт
Возникает цикличесткая ссылка. 1С это как-то разруливает,  но размер объекта в кеше достигает 1 мб.
  И тогда любой запрос вызывает рост выделенной памяти и где то на уровне 2 Гб клиент падает
6 ProxyInspector
 
26.12.18
11:43
(4) Нормальной платформы в 1С нет. И само ничего не почистится
7 palsergeich
 
26.12.18
11:44
(6) У меня почему то чистится
8 palsergeich
 
26.12.18
11:46
Не в 0 конечно, но любая вкладка браузера в итоге есть больше)
А так перезапуск службы раз в сутки скриптом и все путем.
9 polosov
 
26.12.18
11:46
(5) Позволю себе не согласиться, что устроено плохо кеширование. Сейчас не 90-е, когда надо сразу прибивать объект в памяти и освобождать ее. Стратегия менеджера памяти вполне согласуется с нормальным кешированием. Возможно эти объекты могут понадобиться, поэтому они держатся в памяти какое-то время и плюс нет недостатка памяти, поэтому менеджер не принимает решение об освобождении.
10 seevkik
 
26.12.18
11:46
У меня браузер без вкладок больше ест, в чем проблема?
11 ProxyInspector
 
26.12.18
11:46
Т.е. ты видишь, что память выделенная клиенту уменьшается? Я такого не видел никогда. 1С декларирует, что выделенная память просто стабилизируется
12 palsergeich
 
26.12.18
11:48
(11) Угу, какое нибудь чтение файла в память гигов на 5 и при окончании - прекрасно чистистя, как пример.
13 palsergeich
 
26.12.18
11:50
а 100 или 110 мб будет в памяти жить, в то время когда любая страница браузера кушает минимум 200 мб, это не то на что надо обращать настолько пристальное внимание
14 ProxyInspector
 
26.12.18
11:50
Конечно перезапуск Сервера, Kлиента осdобождает память :)
Самое интересное, что этот кеш, который достигает 200 мб никому не нужен. Там данные стухли, как только они были получены из базы.
   Естественно чтение файла в память при окончании чистится, а вот кеш данных - нет
15 ProxyInspector
 
26.12.18
11:57
100 - 300 мб в памяти будут жить долго. Если 100 клиентов, тогда это будет 30 Гб оперативки.
  Объем этого кеша зависит от тех объектов, которые ты выбираешь.
  Если у тебя справочник Валюты, имеет два элемента и ты запустишь в цикле 10 тыс раз выборку, то 1с съест 100 мб  
Если у тебя справочник Номенклатура, имеет два элемента и ты запустишь в цикле 10 тыс раз выборку, то 1с съест 300 мб
  И никогда не отдаст. Т.е. 1С не умеет освобождать память.
16 ProxyInspector
 
26.12.18
11:58
Я просто потратил на эту фигню примерно неделю. Когда мне надо было на базе с 1 млн документов перепровести их.
17 polosov
 
26.12.18
11:58
(14) Это откуда данные, что кеш не чистится? Выделенная куча менеджером может не уменьшаться, чтобы не тратить ресурсы (тем более если памяти еще хватает), но протухшие данные кеша могут заменяться на новые данные.
18 palsergeich
 
26.12.18
12:01
(15) 100 клиентов физически на 30 гб оперативы жить не смогут, начнем с этого.
Если мы говорим про именно клиентское окно на каком нибудь терминале.
19 ProxyInspector
 
26.12.18
12:02
(17) Все правильно. Выделенная куча менеджером не уменьшается. протухшие данные кеша заменяются на новые данные. Если новым данным требуется больше места, то дополнительно выделяется память. Но НИКОГДА она не освобождается
20 palsergeich
 
26.12.18
12:03
(19) Просто прочитай 5 гигов в память на клиенте и посмотри.
21 polosov
 
26.12.18
12:04
(19) Не забывай еще про ОС
https://habr.com/post/158347/
22 palsergeich
 
26.12.18
12:05
При тяжелых клиентских алгоритмах когда память там до 1-2 гб разбухала все прекрасно чиститься до обычных 100-300
23 palsergeich
 
26.12.18
12:06
Так же возможны особенности конкретного релиза платформы, гдето это работает лучше, где то хуже.
24 ProxyInspector
 
26.12.18
12:08
Вот я посмотрел на нашей текущей базе. 30 клиентов съели 4 гига памяти.
  Но эти клиенты вообще почти ничего не делают.
  Я же писал, что память бывает разная. Если ты запускаешь отчет, то 1С съест 100-200 метров на кеш в момент выборки и эту память никогда не освободит, и еще метров 200 на обработку, эту освободит.
25 polosov
 
26.12.18
12:08
(23) Дополню. Платформы, ОС, версии компилятора C, который используется для сборки платформы.
26 ProxyInspector
 
26.12.18
12:11
Все платформы работают одинаково с кешем.
27 ProxyInspector
 
26.12.18
12:14
Это мы сейчас говорим о памяти, выделенной клиенту. В том числе "тонкому" клиенту, которые тоже едят по 200 метров памяти, при объеме базы 300 метров.
  Мы не рассматриваем кеширование конфигурации на клиенте или кеширование на сервере. Там вообще МРАК полный
28 polosov
 
26.12.18
12:14
(26) С собственным кешом - да. Но конечную стратегию выделения/освобождения памяти определяет ядро ОС.
29 ProxyInspector
 
26.12.18
12:16
Плохое быстродействие 1С связано на 90% с кривым кешированием. Это когда 1с пытается все затащить в кеш, и затраты на это превышают отдачу.
30 Фрэнки
 
26.12.18
12:20
Описанное в топике явление не стоит называть "утекает память"

А само по себе это явление известное и в критичных случаях методы борьбы с ним тоже давно давно придуманы.
31 polosov
 
26.12.18
12:20
(29) Затраты на поддержание актуализации кеша не могут быть выше затрат повторного чтения данных по каналам АТА-устройств. Причем ОС может сбрасывать страницы в дисковые кешы, прозрачно для платформы.
32 ProxyInspector
 
26.12.18
12:22
В нормально реализованных системах "конечную стратегию выделения/освобождения памяти определяет ядро ОС". Современные ОС временные файлы помещают в оперативную память Однако и тут 1С опередило мир. Я не знаю как 1С это удается, но каждый раз временные файлы создаются заново и ОС вынуждена создавать их на диске. Поэтому для 1С и требуется SSD.
33 ProxyInspector
 
26.12.18
12:24
Короче кеш - это основная беда 1С. Об этом и так все знают. Именно отсюда растут ноги типа. Перезагрузка сервера 1с раз в сутки. Перезапуск процессов rphost. Очистка кеша пользователей, сервера.
34 unregistered
 
26.12.18
12:25
(0) > что не так в обработке?

Зачем тянуть это всё на клиента?
Сделайте обработку кода на сервере.

Зачем в выборке поле "Код"?
Зачем в выборке поле "СтавкаНДС"? Если уж зачем-то тяните это поле, то подставляйте туда сразу нужное значение - 20%, а не в цикле дёргайте.
35 ProxyInspector
 
26.12.18
12:28
Если делать на сервере, тогда будет увеличиваться rphost :)
36 ProxyInspector
 
26.12.18
12:32
Реально у (0) проблем нет. Там всего то 100 мб. У меня при перепроведении  и с наличием (5) выделение памяти росло до 2 ГБ и клиент падал. Я просто не мог перебрать все документы в базе.
37 D_E_S_131
 
26.12.18
12:34
Нафига "Попытка...Исключение"? Чего бы не заблокировать нужные элементы ДО записи?
38 ptiz
 
26.12.18
12:38
(37) "Чего бы не заблокировать нужные элементы ДО записи?" - это тоже надо заворачивать в Попытку, по-хорошему :)
39 D_E_S_131
 
26.12.18
12:40
(38) Но это хотя бы выглядит логично. А тут еще и получение объекта в "попытке", и никакой реакции на исключение. Память зато "утекает" проблема...
40 Вафель
 
26.12.18
12:45
(37) и если не заблокировал, то ничего не делать
41 demiurggig
 
26.12.18
12:46
(37) Объект может не записаться, например, из-за битой ссылки.

(39) Реакция есть, простоя ее убрал чтобы не засорять код.
42 palsergeich
 
26.12.18
12:55
(36) я недавно ради эксперимента сначала создал, а потом перепроверь 10м документов, такой штуки не было.
43 demiurggig
 
26.12.18
13:05
(34) >> Зачем тянуть это всё на клиента?
Сделайте обработку кода на сервере.


У меня толстое формы, то есть не управляемые
44 ProxyInspector
 
26.12.18
13:35
(42) Конечно не было. У тебя легкие документы. Соответственно 1с отъела 60 мб памяти и все.
Если ты хочешь посмотреть как "утекает" память. Сделай выборку справочника Номенклатура и получи все реквизиты каждого элемента справочника. Простым перебором.
   Я думаю, что 1с потребуется 100 мб для БУХ, 200 мб для УТ10, 300 мб для УТ11 или УПП