Потребление места на диске С в папке temp

24.06.22

База данных - HighLoad оптимизация

Решение проблемы постоянного роста папки %AppData%/Local/Temp.

Первым делом смотрим виновника в мониторе ресурсов:

Видим что им является один из процессов rphost с id 8484. (Remote Process HOST)

Далее, смотрим все сеансы этого рабочего процесса, где-то в последних столбцах таблицы ищем потребление диска:

Видим 6 сеансов на этом процессе:

Ага, вот и наш ненасытный сеанс, открытый фоновым заданием под пользователем Adm в 9:57. В колонке "Запись (Текущая)" значение достигло 138 гб! (пред. скрин). Кстати, с этого же времени висит ещё одно. Может они связаны.

Далее идем в консоль заданий и ищем что его породило:

Смотрим код первого:

К сожалению по заданному пути никакого скрипта не было.
И оно, даже не смотря на блок попытки, просто зависало с ошибкой:

Ок, не наш случай. Добавим проверку на существование файла и идём дальше. Код второго регламентного:

Здесь уже интересней. При достаточно большом размере выбираемых данных до второй точки останова выполнение никогда не дойдет.

Когда в запросе выбирается реквизит типа хранилище значений с бинарными данными (поле ФайлДанных) - тогда в результирующую выборку попадает весь размер всех файлов одновременно!

В нашем случае это вызывает ошибку нехватки места на диске:

При выполнении метода Выполнить() данные запроса могут сбрасываться на диск, и вот почему:

http://its.1c.ru/db/v8std#content:-2145782922:1

1. Не следует разрабатывать решения исходя из неограниченного объема оперативной памяти. Для многопользовательских систем любое неэффективное использование памяти может катастрофически сказаться на работоспособности.

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

2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера. 
Например, неправильно:

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

// Выгрузка всего справочника в таблицу значений 
Номенклатура = Запрос.Выполнить().Выгрузить(); 
Для каждого ПозицияНоменклатуры Из Номенклатура Цикл
// Обработка элемента справочника 
// ...
КонецЦикла;

поскольку весь результат запроса сразу помещается в память, в таблицу значений.
Также неправильно:

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";


РезультатЗапроса = Запрос.Выполнить();
// Обход результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;

поскольку и в этом случае при выполнении запроса его результат будет сначала считан в память целиком (*).

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

Правильно ограничивать результат запроса искусственно:

ВсеОбработано = Ложь;
Пока Истина Цикл
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ ПЕРВЫЕ 1000
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| <условие выборки необработанных записей>";


РезультатЗапроса = Запрос.Выполнить();
ВсеОбработано = РезультатЗапроса.Пустой();
Если ВсеОбработано Тогда
Прервать;
КонецЕсли;


// Обход порции результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;


КонецЦикла;

Также правильно:


Выборка = Справочники.Номенклатура.Выбрать(..., Отбор);
Пока Выборка.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;

поскольку в этом случае платформа 1С:Предприятие выполняет курсорный запрос.

Кроме того, число элементов выборки автоматически ограничивает платформа 1С:Предприятие в запросах динамических списков.

Таким образом, переписав код на получение значения хранилища через ключ записи, избавляемся от ошибки нехватки памяти:

 

Вывод: никогда не делайте неограниченную выборку полей типа ХранилищеЗначения, иначе забьёте память и диск!

 
 
 Динамическая же выборка считывает по 25 записей за раз

upd: insurgut +

upd 24.06.22 : ещё одна причина потребления места в папке tmp

Анализ консоли кластера выявил равномерный рост Записи текущих данных
Завершение сеансов регзаданий в топе потребления ресурсов не помогало, рост продолжался, зависших регзаданий не было
Удалили все незанятые процессами файлы, что делать нельзя (отвалились макеты компонент, потребовался мягкий перезапуск)
После удаления увидели закономерность в создании файлов с одинаковым размером 2525 кб
Вручную начал сохранять по одному общие макеты на диск, был найден совпадающий по размерам
Виновником оказалась недавно включенная внешняя компонента КомпонентаПечатиШтрихкодовWindows64
При падении шло повторное её подключение без очистки, что и вызывало неконтролируемое дублирование файлов

См. также

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    9262    Evg-Lylyk    61    

44

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    5097    spyke    28    

49

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    7577    vasilev2015    20    

42

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12426    241    ZAOSTG    81    

115

HighLoad оптимизация Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Принимать, хранить и анализировать показания счетчиков (метрики) в базе 1С? Почему бы нет? Но это решение быстро привело к проблемам с производительностью при попытках построить какую-то более-менее сложную аналитику. Переход на PostgresSQL только временно решил проблему, т.к. количество записей уже исчислялось десятками миллионов и что-то сложное вычислить на таких объемах за разумное время становилось все сложнее. Кое-что уже практически невозможно. А что будет с производительностью через пару лет - представить страшно. Надо что-то предпринимать! В этой статье поделюсь своим первым опытом применения СУБД Clickhouse от Яндекс. Как работает, что может, как на нее планирую (если планирую) переходить, сравнение скорости работы, оценка производительности через пару лет, пример работы из 1С. Все это приправлено текстами запросов, кодом, алгоритмами выполненных действий и преподнесено вам для ознакомления в этой статье.

1 стартмани

24.01.2024    5669    glassman    18    

40

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    14022    doom2good    49    

71
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. w.r. 650 26.04.19 17:19 Сейчас в теме
Полная выборка справочника (регистра) - интересно, а зачем?
2. PerlAmutor 155 26.04.19 17:43 Сейчас в теме
(1) Вероятно, программист, написавший этот запрос предполагал, что данных в регистре будет немного и не учел того, что их размеры могут зависеть от выбора пользователей.

Всегда интересно почитать про расследования.

Я вот сейчас тоже веду два расследования. Пока безуспешно. Тех. журнал не помогает. Исключения, которые сыпятся в журнал зависят от данных в параметрах процедур, а ТЖ их не логирует никак, да еще и общие модули БСП. Пришлось ставить "ловушки" кодом, изменяя конфигурацию, посмотрю что именно попадается пользователю. Вторая - плавающая ошибка платформы, приводящая к краху всех клиентских сессий. Ошибка является следствием каких-то действий, но каких именно и кто был первым инициатором выяснить не удается. Исключение получается лавинообразным по всей системе.
klaus38; acanta; +2 Ответить
4. w.r. 650 27.04.19 06:06 Сейчас в теме
(2)

Меня смущает здесь полная выборка, а потом уже наложение условия внутри

ИнфоПрайсЛистов.ПрайсЛистБылУжеУспешноОбработан(ХэшФайла)


Лучше соединить запрос этой функции с запросом с полной выборкой. Тогда сразу будет существенное сокращение результатов выборки
3. user-z99999 71 26.04.19 21:54 Сейчас в теме
Запрос.Выполнить().Выгрузить();
Запрос.Выполнить().Выбрать();

В одном случает улетает результат в оперативную память, в другом - на диске во временную папку.
Можете проверить и написать в каком из случаев куда летит результат запроса.
mitia.mackarevich; rpgshnik; +2 Ответить
5. rpgshnik 3795 29.04.19 05:45 Сейчас в теме
Это же всё ошибки доработок или разработчиков типовых поставок?)
6. insurgut 208 29.04.19 06:06 Сейчас в теме
Ага, вот и наш ненасытный сеанс, открытый фоновым заданием под пользователем Adm в 9:57.

По какому принципу определили, что именно этот сеанс виноват?

Затираем несуществующий путь, идём дальше.

А разве не правильнее было переделать попытку (или добавить в коде попытки) условие на ФайлСуществует?

И вот почему:

Странно, выше говорится о проблеме выборки в запросе данных с типом ХранилищеЗначений, а в качестве объяснения непонятно к чему приводится пример с выборкой ссылок из справочника номенклатуры. Разбитие запроса на порции может и не решить конкретно в вашем случае проблемы с потреблением памяти. В результате проблема решается как положено, но к чему приведена информация о разбиении запроса на порции - не понятно.

P.S. За труды в любом случае "+" :)
12. kuzyara 2090 23.05.19 04:55 Сейчас в теме
(6)
По какому принципу определили, что именно этот сеанс виноват?
По объему записи/чтения диска
А разве не правильнее было переделать попытку (или добавить в коде попытки) условие на ФайлСуществует?
Да, действительно плохо, переделал.
Странно, выше говорится о проблеме выборки в запросе данных с типом ХранилищеЗначений, а в качестве объяснения непонятно к чему приводится пример с выборкой ссылок из справочника номенклатуры.
К сожалению это единственное место, где я смог найти упоминание о свопе результатов запроса на диск (
7. rozer 311 29.04.19 08:46 Сейчас в теме
off:

Вспомним Душелова ...
RIP


https://forum.mista.ru/topic.php?id=597601&page=2
acanta; Jokemas; artbear; Jestery; swimdog; CyberCerber; KonstB; itriot11; serg_gres; +9 Ответить
8. KonstB 180 29.04.19 10:53 Сейчас в теме
(7) Прям в глаза бросилось 2019... как так подумал я
RIP
9. gadmin 30.04.19 16:09 Сейчас в теме
(7)
off:

Я знал Васю лично, помним!(7)
10. logarifm 1122 02.05.19 10:28 Сейчас в теме
(0) А еще есть такая штука как MS SQL Server и план запроса, где видно задействует-ли он для получения данных отличный оператор как

Spool и если база Tempdb на этом же диске тогда вообще я не вижу никаких аномалий и странностей.
11. riposte 391 03.05.19 08:32 Сейчас в теме
Можно подключить файлопомойку террабайта на 2
(из двух SATA-шников в R1, какого-нибудь тырпрайз уровня, которые заявляются как 24\7 с большой устойчивостью к вибрациям)
и слинковать туда толстые temp через mklink /J
Или целиком перенести туда профили.
И износ системного харда уменьшим, и место уменьшаться перестанет так стремительно.
13. Xershi 1555 07.10.20 10:16 Сейчас в теме
В типовых бинарники в тома вынесли.
Чтобы такие мастера не ломали сервер.
Оставьте свое сообщение