Почему MS SQL Server не сразу забирает всю память и из-за чего разрастается tempdb при работе с 1С?

Системный администратор 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При настройке серверных мощностей для работы с тяжелыми конфигурациями 1С, такими как 1С:Комплексная автоматизация или 1С:ERP, системные администраторы часто сталкиваются с неочевидным поведением MS SQL Server. Вопросы обычно касаются двух аспектов: управления оперативной памятью (RAM) и «прожорливости» системной базы данных tempdb. Разберем эти механизмы подробно, чтобы понимать, как эффективно сконфигурировать сервер.

Механизмы выделения оперативной памяти в MS SQL Server

Рассмотрим ситуацию: вы установили лимиты Minimum server memory и Maximum server memory. Однако после перезапуска службы SQL Server вы видите, что процесс sqlservr.exe занимает всего несколько гигабайт, несмотря на установленный минимум в сотни гигабайт. Почему так происходит?

Проанализируем алгоритм работы SQL Server. Настройка «Minimum server memory» не является командой на немедленное резервирование физической памяти при старте. Это порог обязательства. SQL Server начинает работу с минимально необходимым набором страниц памяти и постепенно наращивает потребление по мере поступления запросов и кэширования данных в Buffer Pool. Только когда объем занятой памяти достигнет установленного «минимума», сервер перестанет отдавать эту память операционной системе, даже если ОС будет испытывать дефицит.

Выясним причину медленного роста потребления памяти. Для 1С основной объем ОЗУ потребляет кэш данных. Если ваша база составляет 250 Гб, а пользователи еще не успели сформировать тяжелые отчеты или провести массовые документы, серверу просто нечего «складировать» в оперативную память. Постепенно, по мере обращения к различным таблицам и индексам, SQL Server будет подгружать их в память, пока не достигнет лимита Maximum server memory.

Чтобы оптимизировать этот процесс, разберем по шагам важную настройку ОС — Lock Pages in Memory (Закрепление страниц в памяти):

  1. Откроем редактор локальной групповой политики (gpedit.msc).
  2. Перейдем в раздел: Конфигурация компьютера -> Конфигурация Windows -> Параметры безопасности -> Локальные политики -> Назначение прав пользователя.
  3. Найдем пункт «Закрепление страниц в памяти» (Lock pages in memory) и добавим туда учетную запись, под которой запускается служба SQL Server.
  4. Это предотвратит сброс страниц памяти SQL Server в файл подкачки (pagefile), что крайне важно для стабильно высокой скорости работы 1С.

Причины и контроль разрастания базы tempdb

Системная база tempdb — это «черновик» для SQL Server. В контексте 1С она используется постоянно. Рассмотрим основные причины, по которым файлы этой базы могут разрастись до заполнения всего дискового пространства:

1. Версионное хранилище (Version Store): Платформа 1С:Предприятие 8.3 по умолчанию рекомендует использовать режим Read Committed Snapshot Isolation (RCSI). При этом режиме любые изменения строк не блокируют чтение: старая версия строки копируется в tempdb. Если в системе есть «зависший» сеанс или очень долгая транзакция, SQL Server не может очистить эти версии, и tempdb растет лавинообразно.

2. Сортировки и хэширование: Проанализируем выполнение запросов. Если 1С выполняет сложный запрос (например, расчет себестоимости или большой отчет по остаткам), а серверу не хватает выделенной оперативной памяти для сортировки данных в ОЗУ (Memory Grant), он сбрасывает эти операции в tempdb. Это называется Sort Warnings или Hash Warnings. Работа с диском медленнее, чем с ОЗУ, и это требует места.

3. Временные таблицы 1С: Разработчики 1С активно используют объекты типа МенеджерВременныхТаблиц. Все таблицы, созданные в коде 1С (вида #tt1), физически создаются и хранятся в tempdb.

Посмотрим на пример того, как проверить, сколько места в tempdb действительно занято данными, а сколько является просто зарезервированным «пустым» местом:


USE tempdb;
GO
SELECT 
    name AS FileName, 
    size*1.0/128 AS TotalSizeMB,
    FILEPROPERTY(name, 'SpaceUsed') AS SpaceUsedMB,
    df.state_desc AS Status
FROM sys.database_files AS df;

Если вы видите, что TotalSizeMB составляет 100 Гб, а SpaceUsedMB — всего 2 Гб, значит, сервер просто расширил файлы «про запас» после разовой тяжелой операции и не собирается их сжимать самостоятельно.

Оптимальная настройка файлов tempdb

Для устранения конкуренции за распределение страниц (PFS, GAM, SGAM) рекомендуется создавать несколько файлов данных tempdb. Разберем основные правила:

Инициализация файлов и производительность

Выясним, как ускорить расширение файлов. По умолчанию SQL Server при создании или расширении файла зануляет его (пишет нули на диск), что занимает время. Мы можем включить Мгновенную инициализацию файлов (Instant File Initialization). Для этого:

  1. Зайдем в «Локальные политики безопасности».
  2. Выберем «Выполнение задач по обслуживанию томов» (Perform volume maintenance tasks).
  3. Добавим пользователя службы SQL Server.

После этого файлы tempdb будут расширяться мгновенно, не блокируя работу пользователей 1С в момент нехватки места.

RAM-диск или системный Buffer Pool?

Рассмотрим дилемму: стоит ли выносить tempdb на виртуальный RAM-диск? Большинство экспертов сходятся во мнении, что это нецелесообразно при наличии достаточного объема ОЗУ. SQL Server сам эффективно кэширует страницы tempdb в своей оперативной памяти. Выделяя память под RAM-диск, вы отнимаете её у основного кэша данных (Buffer Pool). Кроме того, сбой драйвера стороннего RAM-диска приведет к падению всего SQL Server.

Вердикт: Лучше отдать лишние 64 Гб в Maximum server memory, чем создавать на них RAM-диск. SQL Server распорядится этой памятью более гибко.

Рекомендации по обслуживанию

Если tempdb разросся до неприличных размеров, выполните следующие шаги:

  1. Попробуйте выполнить команду DBCC SHRINKDATABASE(tempdb, 10); в технологическое окно. Однако помните, что частое сжатие вызывает фрагментацию.
  2. Самый надежный и «чистый» способ — перезагрузить службу SQL Server. При каждом перезапуске tempdb пересоздается с начальными размерами, указанными в настройках.
  3. Никогда не включайте опцию AUTO_SHRINK для tempdb. Это уничтожит производительность сервера из-за постоянных циклов расширения/сжатия.

Проанализировав ситуацию, можно сделать вывод: рост tempdb — это нормальный процесс эксплуатации SQL Server под нагрузкой 1С. Главное — обеспечить серверу достаточное дисковое пространство (с запасом 20-30% от размера основной базы) и правильно настроить количество файлов данных для параллельной обработки запросов.

← На главную