Потребление места на диске С в папке 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 Конфигурации 1cv8 Бесплатно (free)

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

13.03.2024    2406    spyke    26    

38

Анализируем SQL сервер глазами 1С-ника

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

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

1 стартмани

15.02.2024    7357    149    ZAOSTG    66    

95

Удаление строк из таблицы значений различными способами с замером производительности

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

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

09.01.2024    5766    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8590    ivanov660    6    

75

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    4999    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    15962    skovpin_sa    14    

98

Как эффективно настроить autovacuum в Postgres для 1С

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

Кто не любит убирать мусор? Думаю, практически все, а вот в Postgres это обязательный ритуал для эффективной работы. Как эффективно настроить уборку за 1С в Postgres, можно прочитать в этой статье и еще раз задуматься о бесплатности Postgres.

05.08.2023    4975    1CUnlimited    5    

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

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

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

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

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


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

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

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

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

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

И вот почему:

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

P.S. За труды в любом случае "+" :)
12. kuzyara 1896 23.05.19 04:55 Сейчас в теме
(6)
По какому принципу определили, что именно этот сеанс виноват?
По объему записи/чтения диска
А разве не правильнее было переделать попытку (или добавить в коде попытки) условие на ФайлСуществует?
Да, действительно плохо, переделал.
Странно, выше говорится о проблеме выборки в запросе данных с типом ХранилищеЗначений, а в качестве объяснения непонятно к чему приводится пример с выборкой ссылок из справочника номенклатуры.
К сожалению это единственное место, где я смог найти упоминание о свопе результатов запроса на диск (
7. rozer 305 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 1116 02.05.19 10:28 Сейчас в теме
(0) А еще есть такая штука как MS SQL Server и план запроса, где видно задействует-ли он для получения данных отличный оператор как

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