Как в базе 1С на 4,2 ТБ нашлось 3,85 ТБ мёртвого кэша: расследование и диагностика

28.07.26

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

База 1С розничной сети выросла до 4,2 ТБ: бэкап — два часа, кассиры ждут список чеков по 25 секунд, диски кончаются. Прежде чем что-то чинить, мы две недели строили карту «что сколько занимает» — платформенными средствами, через ПолучитьСтруктуруХраненияБазыДанных(). Диагноз удивил всех: 3,85 ТБ — мёртвый кэш механизма разграничения доступа БСП, копившийся с 2020 года. Разбираем: как ставится такой диагноз, три красивые гипотезы, которые не подтвердились, почему кэш нельзя просто удалить (208 живых ролей), матрица эквивалентности прав на 329 проверок и почему вечерние «блокировки» оказались параллелизмом. Очистка — только штатными средствами; главный герой статьи — диагностика.

База 1С весом 4,2 терабайта. Ночной бэкап — два часа и 556 ГБ. Места на дисках почти нет, кассиры ждут список чеков по 25 секунд, а вечером, в час закрытия смен, всё «залипает». Знакомая картина? Нам предстояло с ней разобраться — и первое, что мы сделали, это не стали ничего чинить. Две недели ушло на диагноз. Он того стоил: выяснилось, что больше 90 % базы — вообще не данные бизнеса.

Это история-расследование о диагностике: с картой объёмов, тремя красивыми гипотезами, которые не подтвердились, и неожиданным виновником, который съел 3,85 из 4,2 терабайт. Спойлер: это была не история продаж и не версии документов.

 

Завязка: пациент и симптомы

Вводные. Розничная сеть fashion-сегмента: три страны, около 200 касс, 11 боевых баз 1С (Розница + ERP). Главная база — 4,2 ТБ — росла быстрее, чем бизнес, который она обслуживает. Симптомы на момент обращения:

  • Диски. Файл данных — 4 197 ГБ, свободного места на сервере почти не осталось. Дальше — только закупка СХД.
  • Бэкапы. Полный ночной бэкап — около 2 часов и 556 ГБ в сжатом виде. Восстановление тестового контура — событие, которое планируют заранее.
  • Кассы. Список чеков под кассиром открывался ~25 секунд. В вечерний пик закрытие смен подвисало.
  • Соседи. SQL-сервер общий: на одном инстансе живут десятки баз и делят диск, память, tempdb и процессорные ядра.

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

 

Метод: карта «что сколько занимает» — прежде любых действий

По опыту, в задачах вида «база слишком большая и всё тормозит» самое дорогое — это не решение, а правильный диагноз. Инструмент диагностики штатный и доступен каждому: метод глобального контекста ПолучитьСтруктуруХраненияБазыДанных() возвращает соответствие объектов метаданных таблицам хранения. Дальше остаётся сопоставить этому списку размеры таблиц из административных отчётов СУБД (стандартные отчёты о занимаемом месте, доступные администратору сервера) — и отсортировать.

В нашем случае карта связала 3 585 таблиц с метаданными. Ожидания у всех участников были стандартные: «наверное, документы за десять лет», «наверное, версии объектов», «наверное, логи». Реальность оказалась интереснее:

 

Что Объём
История версий шаблонов ограничения доступа 3,34 ТБ
Очередь «пересчитать ключи доступа пользователей» (1,18 млрд строк) 287 ГБ
Очередь «пересчитать ключи доступа к данным» (1,19 млрд строк) 221 ГБ
Итого: служебный кэш механизма разграничения доступа ≈ 3,85 ТБ из 4,2 ТБ

 

Прочитайте таблицу ещё раз. Больше 90 % четырёхтерабайтной базы — не данные бизнеса. Это служебный кэш универсального механизма ограничения доступа на уровне записей (RLS в терминологии БСП), который годами рос и никогда не использовался по назначению: регламентные задания пересчёта ключей доступа были выключены ещё в 2020 году. Механизм исправно складывал в очереди задания «пересчитать», которые никто никогда не забирал, и версии шаблонов ограничений, которые никто никогда не читал.

То есть база не «разжирела от документов». Она годами копила ТОДО-лист, который никто не собирался выполнять. 2,37 миллиарда строк ТОДО-листа.

Откуда вообще берётся такой кэш

В типовых конфигурациях на «Библиотеке стандартных подсистем» есть два способа ограничивать доступ на уровне записей. Классический — условие подставляется прямо в текст запроса каждого списка: дёшево в хранении, но каждое чтение платит за вычисление условия. И универсальный — система заранее рассчитывает «ключи доступа»: материализует для каждого пользователя и каждого объекта ответ на вопрос «видит / не видит», чтобы в момент чтения оставалось только соединиться с готовой таблицей ключей.

Универсальный механизм — это по сути гигантский материализованный кэш прав. И как любой кэш, он требует инвалидации: каждое изменение ролей, профилей или состава пользователей ставит в очередь задания на пересчёт ключей, а изменения шаблонов ограничений версионируются. Пока регламентные задания пересчёта работают, очереди перемалываются и система находится в равновесии. Но если задания однажды выключить — например, потому что пересчёт грузил сервер, — механизм не останавливается. Он продолжает прилежно ставить задачи в очередь, которые больше никто не забирает, и накапливать версии шаблонов, которые больше никто не читает. Никаких ошибок, никаких предупреждений: просто две очереди по миллиарду строк и 3,34 ТБ истории версий шесть лет спустя. Идеальное преступление.

 

Глава, которую мы любим больше всего: отброшенные гипотезы

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

Гипотеза 1. «RLS отключён — значит, всё это мусор, сносим целиком»

Раз регламентные задания пересчёта выключены с 2020 года, соблазнительно решить, что механизм мёртв целиком: очистить кэш, отключить ограничения, разойтись. Проверка ролей показала обратное: 208 ролей реально используют ограничения доступа по условию. Механизм жив, им пользуются каждый день, просто его кэширующая часть превратилась в свалку. Снести «всё целиком» означало бы открыть кассирам чужие магазины.

Гипотеза 2. «Мусор накопили уволенные сотрудники — почистим по ним»

Красивая версия: справочник пользователей разросся до 5 600 карточек, из которых активны ~150. Логично предположить, что ключи доступа уволенных и составляют массу кэша. Посчитали: живых ключей доступа — 660 строк. Из миллиардов. Эффект от чистки «по уволенным» — десятки килобайт. Не гигабайт. Килобайт.

Гипотеза 3. «Виноват вот этот конкретный медленный регистр»

В метриках сервера СУБД стабильно светился один регистр с чудовищными чтениями — идеальный подозреваемый. При внимательном разборе выяснилось, что регистр… из соседней базы на том же инстансе. Урок бесплатный, но выстраданный: на общем сервере любую метрику сначала фильтруйте по конкретной базе. Иначе будете неделю оптимизировать чужую систему.

 

Почему «просто удалить кэш» нельзя — и что делать сначала

Ключевая развилка проекта: пока динамические списки работают через универсальный механизм, его кэш нельзя трогать — без кэша универсальный RLS начнёт вычислять права «на лету», и кассы лягут окончательно. Значит, сначала база переводится с универсального механизма разграничения доступа на классический — отбор по магазину прямо в запросах динамических списков. Это полностью прикладная доработка: отбор внедрён в 23 документах средствами конфигурации. После этого кэш становится по-настоящему мёртвым, а списки начинают работать быстро, потому что перестают тащить за собой каскад служебных соединений.

Замер эффекта на списке чеков (с учётом RLS): 162 млн логических чтений → 94. Плюс отдельно — добавление недостающих индексов под кассовые операции: список чеков открылся мгновенно вместо 25 секунд, 505 410 логических чтений → 4. Такой порядок улучшения — почти всегда признак того, что раньше запрос просматривал таблицу целиком; никакой магии, просто индекс, которого не хватало годами.

 

Права — только через матрицу эквивалентности

Смена механизма доступа — точка максимального риска всего проекта: права — единственная область, где «почти как раньше» равно «авария». Кассир, увидевший чужой магазин, — инцидент безопасности; менеджер, потерявший свой, — остановка работы. Поэтому перед переключением прогонялась матрица эквивалентности прав: 329 проверок «кто что видит до и после» по комбинациям ролей и сценариев, с фиксацией результата по каждой строке. Расхождений — 0. Это самая скучная таблица проекта, и мы ни разу не пожалели о часах, потраченных на её заполнение: скучная таблица сильно приятнее интересного инцидента.

Тем же принципом проверялись доработанные отчёты: результат «до» и «после» сравнивается не «на глаз», а контрольной суммой по нормализованной выгрузке. Дёшево — и снимает все споры об «идентичности данных».

 

Вечерний пик: все думали на блокировки — виноват был параллелизм

Второй сюжетный поворот расследования. Все были уверены, что вечерние залипания касс — это блокировки. Аудит показал: блокировок в пик — ноль. Душил кассы агрессивный параллелизм: заводские настройки сервера СУБД (cost threshold for parallelism = 5, MAXDOP = 0) на 48-ядерном сервере отправляли даже лёгкие запросы разбегаться по всем ядрам, и две трети запросов в пик просто стояли в очереди за потоками. Лечение — административная настройка сервера: cost threshold 5 → 50, MAXDOP 0 → 8, динамически, с заранее подготовленным откатом. Это стандартные серверные параметры, рекомендации по которым есть в любой методике обслуживания нагруженных СУБД.

 

Что было дальше — и что осталось за рамками статьи

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

  • объектное удаление средствами платформы — порциями, в фоновых заданиях, с контролем ссылочной целостности;
  • штатные регламентные процедуры БСП — у механизмов версий и очередей есть собственные средства очистки, которые нужно включить и настроить;
  • «Тестирование и исправление» с опцией сжатия таблиц — освобождает место после массовых удалений;
  • выгрузка/загрузка через DT — полностью перестраивает базу и убирает фрагментацию: эффективный способ «сбросить вес» после очистки;
  • регламентное обслуживание СУБД без изменения данных — обновление статистики, дефрагментация индексов, настройки производительности сервера: это административные операции, не затрагивающие данные.

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

Результат для понимания масштаба: база — 105 ГБ вместо 4 197, полный бэкап — 18,3 ГБ вместо 556 и минуты вместо двух часов, кассы открывают список чеков мгновенно. Приёмку проводили не мы: представители заказчика под ограниченными правами прошли по чекам, отчётам, остаткам и разграничению доступа. Замечаний не было. Мы вообще считаем, что приёмка глазами исполнителя — это оксюморон: исполнитель смотрит туда, где ожидает увидеть успех.

 

Чек-лист диагностики для тех, у кого база «весит как чугунный мост»

Если у вас конфигурация на БСП с универсальным ограничением доступа и база подозрительно велика:

  1. Постройте карту объёмов. ПолучитьСтруктуруХраненияБазыДанных() + административные отчёты о размерах таблиц, отсортировать по убыванию. Диагноз — до любых действий. Наши 3,85 ТБ кэша нашлись именно так.
  2. Проверьте таблицы механизма доступа БСП: версии шаблонов ограничений, очереди обновления ключей доступа. Если регламентные задания пересчёта выключены, а таблицы растут — вы, вероятно, нашли своего пожирателя дисков.
  3. Не удаляйте кэш, пока не разобрались, кто им пользуется. «Задания выключены» ≠ «механизм мёртв». Посчитайте роли с ограничениями по условию.
  4. На общем инстансе фильтруйте метрики по своей базе. Иначе рискуете оптимизировать соседей.
  5. Проверьте параллелизм до охоты на блокировки. Заводские cost threshold for parallelism и MAXDOP на многоядерном сервере — мина, которая маскируется под «блокировки в пик».
  6. Любое изменение механизма прав — только через матрицу эквивалентности «роль × сценарий × видимость» до и после. У нас в ней было 329 строк, и жалеть не пришлось ни разу.
  7. Отчёты сверяйте контрольной суммой по нормализованной выгрузке, а не глазами.

 

Вместо эпилога

Самое поучительное в этой истории, на наш взгляд, не цифры. А то, что четыре терабайта проблем не были следствием чьей-то ошибки в моменте. Каждый участник в своё время действовал разумно: механизм доступа включили, потому что он был нужен; задания пересчёта выключили, потому что они грузили сервер; на растущую базу махнули рукой, потому что «диски пока есть». Система деградировала маленькими рациональными шагами — и «внезапно» оказалось, что бэкап идёт два часа, а бизнес живёт на 2,5 % своей базы, нося на спине остальные 97,5.

Поэтому главный вывод скучен, как и всё главное: измеряйте. Карта «что сколько занимает» стоит двух недель работы и отвечает на вопрос, который дороже всех остальных: что из этого вообще ваши данные.

Если у вас база тоже «весит как чугунный мост» — начните с карты объёмов из чек-листа. А вопросы и свои грабли несите в комментарии: самое интересное в таких историях обычно всплывает именно там.

Вступайте в нашу телеграмм-группу Инфостарт

диагностика RLS БСП большие базы производительность администрирование MAXDOP ограничение доступа

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

HighLoad оптимизация Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

10.11.2025    11726    ivanov660    48    

53

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

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

18.02.2025    13029    ivanov660    39    

62

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

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

27.08.2024    7635    soulner    10    

41

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    15663    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

06.06.2024    22012    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

13.03.2024    11824    spyke    29    

54
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. lada2011 28.07.26 08:37 Сейчас в теме
Страх парализует систему. Каким образом кассир, видя на экране монитора экранную клавиатуру, держа в руке сканер штрихкода и еле успевая обслуживать покупателей , увидит чужой магазин?
5. nedomolkov.ivan 4 28.07.26 13:43 Сейчас в теме
Кассир в потоке — согласен, ему некогда 🙂 Но RLS защищает не от любопытства кассира, а от доступности данных: под теми же ролями работают менеджеры, ревизоры, бэк-офис — со списками, отборами, отчётами и поиском. «Увидеть чужой магазин» — это не «взглянул на экран», а «данные другого юрлица доступны тому, кому не положено»: обороты, остатки, цены закупки. Для сети из трёх стран это уже не UX-вопрос, а аудит и коммерческая тайна. Матрица нужна не из страха, а из асимметрии цены: проверка стоит часы, инцидент — сильно дороже.
2. muskul 28.07.26 09:49 Сейчас в теме
ну не увидеть что каким то мусором база засралась это прям постараться нужно. непонятно чем там вообшще люди занимались пока 200 точек строили.
Что за матрица эквивалентности?
6. nedomolkov.ivan 4 28.07.26 13:44 Сейчас в теме
(2)
По первой части — отчасти соглашусь: изнутри такое действительно не видят, потому что деградация идёт маленькими шагами, а рост базы легко списывается на рост бизнеса. Мониторинга объёмов в разрезе таблиц не было — потому первым шагом мы (внешняя команда, пришли по симптомам) и строили карту «что сколько занимает».

Матрица эквивалентности — это таблица «роль × сценарий × ожидаемая видимость». До изменений снимаем эталон: пользователь с ролью X в сценарии Y видит ровно набор Z (списки, отчёты, остатки). После перевода на классический RLS прогоняем те же 329 строк и сверяем. Совпало всё — переключаемся; любое расхождение — разбор до причины. Скучно, зато права меняются без инцидентов.
3. SerVer1C 1104 28.07.26 10:21 Сейчас в теме
Самый главный вопрос: почему эта проблема не смутила вас гораздо раньше, например, когда база перевалила за терабайт ???
ASKER_DS; +1 Ответить
7. nedomolkov.ivan 4 28.07.26 13:45 Сейчас в теме
(3)
Справедливый вопрос, и ответ простой: нас тогда ещё не было 🙂 Мы — приглашённая команда: позвали, когда бэкап перестал влезать в ночь, а диски — в бюджет. До этого система жила «изнутри», где рост базы выглядел нормой растущего бизнеса — тем более что рос он равномерно, без резких скачков, которые заставляют насторожиться.

Но с посылом согласен полностью: смутиться стоило на первом терабайте. Поэтому главный вывод статьи — скучное «измеряйте»: карта объёмов стоит часы и отвечает на вопрос «что из этого вообще ваши данные» до того, как их станет четыре терабайта.
4. Tahallus 441 28.07.26 13:31 Сейчас в теме
Вроде решили похвастаться, а получается как-то наоборот.
Вместо того чтобы еще в самом начале разбираться почему база разрастается, вы просили еще дисков, 6 лет.
"И так сойдет".
8. nedomolkov.ivan 4 28.07.26 13:45 Сейчас в теме
(4) Небольшое уточнение ролей: «мы» в статье — внешняя команда. Шесть лет диски просили не мы — мы пришли, когда диски закончились вместе с терпением, и первым делом построили карту объёмов.

А в остальном вы пересказали эпилог статьи 🙂 Она ровно об этом и написана — не «как мы красиво удалили», а «как система деградирует маленькими рациональными шагами и как это поймать диагностикой». Если после прочтения кто-то проверит свои таблицы механизма доступа на втором сотне гигабайт, а не на четвёртом терабайте, — статья свою задачу выполнила.
11. Tahallus 441 28.07.26 18:56 Сейчас в теме
(8) лучше добавил это уточнение что вы внешняя команда которая была привлечена для устранения проблемы
9. SerVer1C 1104 28.07.26 14:13 Сейчас в теме
Ещё для размышления:
Это часть статьи, которую не разрешили публиковать на ИС, ибо опасно трогать скуль голыми руками.
Прикрепленные файлы:
10. nedomolkov.ivan 4 28.07.26 14:45 Сейчас в теме
(9)
Ещё для размышления:
Это часть статьи, которую не разрешили публиковать на ИС, ибо опасно трогать скуль голыми руками.


Знакомая история 🙂 У нас ровно так же: первую версию статьи про обрезку 4,2 ТБ модерация отклонила именно за операции уровня СУБД. Спорить не стали — переписали в чисто диагностическом ключе: платформенная карта объёмов, гипотезы, матрица прав, настройки параллелизма. В таком виде прошла, и, честно говоря, статья стала полезнее: способ удалить у каждого свой, а вот найти проблему нужно всем одинаково.

По _SystemSettings подтверждаю из практики: в базах, где никто не следит за служебными таблицами, она стабильно оказывается в топе. У нас на 4,2 ТБ первое место держал кэш механизма разграничения доступа — 3,34 ТБ истории версий шаблонов плюс 2,37 млрд строк в очередях пересчёта, при выключенных с 2020 года регламентных заданиях. То есть больше 90 % базы были не данными бизнеса.

Ирония в том, что самое ценное в таких историях — не способ удаления, а первый шаг: посмотреть, что вообще лежит в базе, включая таблицы, за которыми не стоит ни один объект метаданных. Их в конфигураторе не видно, а весят они больше всего.
Для отправки сообщения требуется регистрация/авторизация