В практике администрирования 1С часто возникает классический конфликт: разработчик жалуется на то, что база данных разворачивается из резервной копии часами, а системный администратор разводит руками и указывает на мониторинг производительности сервера, где загрузка процессора не превышает 5%, а оперативной памяти занято не более трети. «Сервер простаивает, у нас ресурсов с избытком, это ваша 1С просто не умеет ими пользоваться!» — заявляет администратор. Давайте разберем детально, почему возникает эта иллюзия благополучия, в чем кроется реальная причина медленной загрузки файлов формата .dt и как настроить серверную инфраструктуру, чтобы выжать максимум производительности.
Прежде всего, выясним причину, почему загрузка файла .dt принципиально отличается от разворачивания стандартного бэкапа СУБД (например, .bak в MS SQL или дампа в PostgreSQL). Файл выгрузки .dt — это не снимок базы данных. Это сжатый логический архив, который содержит структуру метаданных конфигурации и таблицы в каноническом (платформонезависимом) представлении XML/JSON-подобного вида.
Когда мы запускаем загрузку этого файла в клиент-серверную базу, платформа 1С выполняет колоссальный объем последовательных операций:
INSERT и пакетами передает СУБД для записи на диск.Самое главное ограничение этого механизма заключается в том, что загрузка данных из .dt выполняется строго в один поток. Платформа 1С:Предприятие не умеет распараллеливать импорт таблиц из одного архива на несколько процессорных ядер. В результате СУБД загружает работой ровно одно ядро процессора физического сервера. На многопроцессорном сервере с 32 или 64 ядрами одно загруженное на 100% ядро как раз и дает те самые «незаметные» 3-5% общей утилизации CPU в диспетчере задач, которые видит системный администратор.
Рассмотрим распространенное заблуждение начинающих специалистов и администраторов, которые используют выгрузку в .dt в качестве регулярного бэкапа рабочих баз. Официальная документация 1С прямо говорит: файл .dt предназначен исключительно для переноса баз данных между различными СУБД (например, с MS SQL на PostgreSQL) или для перевода базы из файлового режима в клиент-серверный и обратно.
Использовать этот формат для ежедневного резервного копирования крайне опасно по следующим причинам:
.dt, даже если в исходной СУБД таблицы имеют логические повреждения или битые ссылки. Обнаружить это получится только в момент загрузки архива, которая аварийно завершится ошибкой СУБД. В итоге вы останетесь с неработающей копией базы.Если вам нужно развернуть тестовую базу для разработки или проверки отчетов, делайте бэкап и восстановление исключительно средствами вашей СУБД. Для MS SQL Server это делается стандартными файлами .bak.
Если избежать загрузки файла .dt невозможно (например, вам передали архив контрагенты или его выгрузили из файловой версии), проанализируем параметры СУБД, которые могут сдерживать скорость записи. По умолчанию базы данных часто создаются с дефолтными настройками, ориентированными на короткие веб-транзакции, а не на массовую потоковую загрузку гигабайтов данных.
Для минимизации задержек на стороне MS SQL Server применим следующие шаги:
1. Настройка авторасширения файлов (Autogrowth)
Если для базы данных настроен слишком маленький шаг прироста файлов базы (.mdf) и лога транзакций (.ldf) — например, по умолчанию стоит 1 МБ или 10% — СУБД будет вынуждена постоянно прерывать поток записи от 1С. Сервер будет приостанавливать работу, запрашивать у Windows выделение нового пространства на диске, физически размечать его и только потом продолжать запись. При загрузке базы объемом в десятки гигабайтов этот цикл повторится тысячи раз, создавая колоссальные задержки.
Перед началом загрузки архива настройте фиксированный шаг авторасширения файлов данных и лога в размере 512 МБ или 1024 МБ. А еще лучше — заранее создайте пустую базу данных и вручную укажите ее размер (например, 20-30 ГБ), чтобы СУБД не тратила время на динамическое выделение места во время импорта.
Изменить эти параметры можно с помощью следующего T-SQL скрипта:
ALTER DATABASE [ИмяВашейБазы]
MODIFY FILE ( NAME = N'ИмяВашейБазы', SIZE = 20GB , FILEGROWTH = 1024MB );
GO
ALTER DATABASE [ИмяВашейБазы]
MODIFY FILE ( NAME = N'ИмяВашейБазы_log', SIZE = 5GB , FILEGROWTH = 512MB );
GO
2. Включение быстрой инициализации файлов (Instant File Initialization)
По умолчанию операционная система Windows при выделении нового пространства под файлы базы данных заполняет каждый сектор диска нулями (процесс зануления). Это гарантирует безопасность данных, но сильно тормозит запись. Мы можем разрешить СУБД мгновенно резервировать пространство без физического зануления.
Для этого откройте редактор локальной групповой политики безопасности Windows (secpol.msc), перейдите в раздел "Локальные политики" -> "Назначение прав пользователя" и найдите пункт "Выполнение задач по обслуживанию томов" (Perform volume maintenance tasks). Добавьте в этот список учетную запись, под которой запущена служба вашего SQL Server, и перезапустите службу СУБД. Это ускорит создание и расширение базы в разы.
3. Использование простой модели восстановления (Simple Recovery Model)
Если для загружаемой базы установлена модель восстановления Full, СУБД будет скрупулезно записывать абсолютно все транзакции импорта в файл лога .ldf. Лог транзакций раздуется до гигантских размеров, перегружая дисковую систему. На время загрузки .dt обязательно переведите базу в модель восстановления Simple:
ALTER DATABASE [ИмяВашейБазы] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
После успешной загрузки вы сможете вернуть модель обратно в Full, если это требуется по регламенту резервного копирования предприятия.
Вернемся к аппаратной части. Почему сервер может работать медленно, если "ему всего хватает"? Современные серверные процессоры (Intel Xeon, AMD EPYC) обладают высокой многопоточностью, но невысокой базовой тактовой частотой на одно ядро (например, 2.0–2.4 ГГц).
Для экономии электроэнергии и снижения тепловыделения по умолчанию в BIOS сервера и операционной системе активированы технологии энергосбережения (C-states, P-states, Intel Demand Based Switching). Когда операционная система видит, что общая загрузка процессора составляет всего 3-5% (поскольку работает только один поток загрузки 1С на одном ядре), она принимает решение "усыпить" неиспользуемые ядра и переводит процессор в экономичный режим. Работающее ядро при этом сбрасывает свою частоту до минимально возможной (часто до 800-1200 МГц), чтобы не перегревать сокет.
В результате наша однопоточная загрузка 1С начинает ползти со скоростью черепахи. Чтобы исправить эту ситуацию, выполните настройки производительности процессора:
Выясним еще одну важную причину медленной загрузки, связанную с архитектурой клиент-серверного взаимодействия. Часто 1С-специалисты запускают "Конфигуратор" со своего рабочего компьютера через локальную сеть, указывают путь к серверной базе и запускают загрузку .dt.
В этом сценарии миллионы записей базы данных начинают передаваться следующим образом:
рабочий компьютер (клиент) считывает файл .dt, распаковывает его, формирует порцию данных, отправляет ее по сети на сервер приложений 1С, сервер 1С обрабатывает ее и отправляет дальше по сети на сервер СУБД.
Даже на гигабитной сети задержка передачи пакетов (Network Latency) между тремя узлами становится критическим фактором, тормозящим весь процесс. Процессоры серверов простаивают большую часть времени просто в ожидании подтверждения сетевых пакетов TCP/IP.
Золотое правило загрузки больших баз: Всегда выполняйте операцию импорта файла .dt локально на самом сервере приложений 1С. Для этого:
.dt на локальный быстрый диск этого сервера.Если сервер приложений 1С и СУБД MS SQL развернуты на одной физической или виртуальной машине, они автоматически начнут взаимодействовать друг с другом по протоколу Shared Memory (общая память), минуя сетевые протоколы и сетевую карту. Это позволяет увеличить скорость обмена данными между 1С и СУБД в несколько раз.
Резюмируем все вышесказанное в виде пошаговой инструкции, которую вы можете использовать совместно с системным администратором для решения проблемы медленной работы системы:
.dt локально на сервер приложений 1С (избегайте работы по сети).Simple)..dt через Конфигуратор локально на сервере приложений..bak), навсегда отказавшись от регулярного использования .dt для резервного копирования.