При настройке серверных мощностей для работы с тяжелыми конфигурациями 1С, такими как 1С:Комплексная автоматизация или 1С:ERP, системные администраторы часто сталкиваются с неочевидным поведением MS SQL Server. Вопросы обычно касаются двух аспектов: управления оперативной памятью (RAM) и «прожорливости» системной базы данных tempdb. Разберем эти механизмы подробно, чтобы понимать, как эффективно сконфигурировать сервер.
Рассмотрим ситуацию: вы установили лимиты 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 (Закрепление страниц в памяти):
Системная база 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 Гб, значит, сервер просто расширил файлы «про запас» после разовой тяжелой операции и не собирается их сжимать самостоятельно.
Для устранения конкуренции за распределение страниц (PFS, GAM, SGAM) рекомендуется создавать несколько файлов данных tempdb. Разберем основные правила:
Round Robin (пропорциональное заполнение). Если один файл будет больше, он будет нагружаться сильнее остальных.Выясним, как ускорить расширение файлов. По умолчанию SQL Server при создании или расширении файла зануляет его (пишет нули на диск), что занимает время. Мы можем включить Мгновенную инициализацию файлов (Instant File Initialization). Для этого:
После этого файлы tempdb будут расширяться мгновенно, не блокируя работу пользователей 1С в момент нехватки места.
Рассмотрим дилемму: стоит ли выносить tempdb на виртуальный RAM-диск? Большинство экспертов сходятся во мнении, что это нецелесообразно при наличии достаточного объема ОЗУ. SQL Server сам эффективно кэширует страницы tempdb в своей оперативной памяти. Выделяя память под RAM-диск, вы отнимаете её у основного кэша данных (Buffer Pool). Кроме того, сбой драйвера стороннего RAM-диска приведет к падению всего SQL Server.
Вердикт: Лучше отдать лишние 64 Гб в Maximum server memory, чем создавать на них RAM-диск. SQL Server распорядится этой памятью более гибко.
Если tempdb разросся до неприличных размеров, выполните следующие шаги:
DBCC SHRINKDATABASE(tempdb, 10); в технологическое окно. Однако помните, что частое сжатие вызывает фрагментацию.tempdb пересоздается с начальными размерами, указанными в настройках.AUTO_SHRINK для tempdb. Это уничтожит производительность сервера из-за постоянных циклов расширения/сжатия.Проанализировав ситуацию, можно сделать вывод: рост tempdb — это нормальный процесс эксплуатации SQL Server под нагрузкой 1С. Главное — обеспечить серверу достаточное дисковое пространство (с запасом 20-30% от размера основной базы) и правильно настроить количество файлов данных для параллельной обработки запросов.