Как устранить тормоза и зависания 1С, если сервер приложений и СУБД работают на разных компьютерах?

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

Разнесение сервера приложений 1С и сервера систем управления базами данных (СУБД) на разные физические компьютеры — стандартный шаг при масштабировании ИТ-инфраструктуры. Однако довольно часто эта схема преподносит неприятный сюрприз в виде резкого падения производительности. Типичный симптом: проведение документов начинает занимать слишком много времени, а при одновременной работе двух баз одна из них работает приемлемо, тогда как вторая начинает «жестко тупить». При этом монитор ресурсов СУБД может показывать минимальную загрузку дисков и процессора.

В этой статье мы подробно разберем, почему возникает этот эффект, проанализируем неочевидные «узкие места» в архитектуре MS SQL Server и платформы 1С, а также по шагам настроим систему для достижения максимального быстродействия без дорогостоящей покупки нового оборудования.

В чем кроется истинная причина «тормозов»: эффект вымывания буферного пула

Давайте проанализируем поведение СУБД, когда на одном сервере крутятся две базы данных объемом 65 ГБ и 92 ГБ (суммарно 157 ГБ), а под нужды MS SQL Server выделено всего 78 ГБ оперативной памяти. В такой конфигурации мы неизбежно сталкиваемся с критической проблемой — вымыванием буферного пула (Buffer Pool Thrashing).

Рассмотрим детально, как СУБД работает с оперативной памятью:

  1. Когда пользователи заходят в первую базу, MS SQL Server начинает активно считывать таблицы и индексы с жестких дисков и кэшировать их в оперативной памяти (в так называемом буферном пуле). База начинает работать быстро, так как все запросы обрабатываются прямо в ОЗУ.
  2. Как только начинается активная работа во второй базе, СУБД требуется место в оперативной памяти для размещения ее данных. Поскольку свободная память закончилась (выделенный лимит в 78 ГБ исчерпан), SQL Server вынужден экстренно выгружать («вымывать») страницы данных первой базы из кэша, заменяя их страницами второй базы.
  3. Когда первому пользователю снова требуются его данные, SQL Server обнаруживает, что в ОЗУ их больше нет. Ему приходится обращаться к медленным дискам SAS, считывать данные заново и вытеснять при этом страницы второй базы.

Этот процесс называется «штормом кэша». В результате дисковая подсистема постоянно занята бесполезным чтением и записью страниц памяти туда-обратно, а показатель Page Life Expectancy (PLE) — ожидаемое время жизни страницы памяти в секундах — падает практически до нуля. Это парализует работу обеих баз данных.

Проверить состояние PLE на вашем сервере СУБД можно с помощью следующего запроса в MS SQL Server Management Studio:


SELECT [object_name], [counter_name], [cntr_value]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Buffer Manager%'
  AND [counter_name] = 'Page life expectancy';

Если полученное значение во время активной работы пользователей опускается ниже 300–500 секунд, это явный сигнал о критическом дефиците памяти под кэш СУБД.

Проблема производительности процессора и однопоточность 1С

Обратим внимание на модель процессора СУБД. Например, четырехъядерный Intel Xeon E5-2407 имеет базовую частоту всего 2.2 ГГц и полностью лишен технологии Turbo Boost. Это критически важное узкое место для СУБД, обслуживающей базы 1С.

Специфика работы платформы 1С такова, что транзакционные операции (включая проведение документов) выполняются строго в один поток. Следовательно, скорость проведения документов напрямую зависит от производительности одного ядра процессора (Single-Thread Performance). Низкая тактовая частота процессора 2.2 ГГц физически не способна быстро обрабатывать тяжелые математические расчеты и транзакции СУБД в современных конфигурациях 1С (особенно в отраслевых решениях по расчету квартплаты ЖКХ, где за один месяц в регистры записываются миллионы строк).

При этом общий показатель загрузки процессора в диспетчере задач может выглядеть безобидно (например, 25% на 4-ядерном процессоре), однако это означает, что одно ядро загружено на все 100% выполнением одной тяжелой транзакции, а остальные ядра простаивают.

Пошаговый план оптимизации системы

Для исправления ситуации выполним комплекс настроек на уровне операционной системы, MS SQL Server, локальной сети и кластера серверов 1С.

Шаг 1. Перенос и тонкая настройка временной базы TempDB

По умолчанию база временных таблиц tempdb часто располагается на системном диске С вместе с операционной системой. Платформа 1С генерирует колоссальное количество временных таблиц при проведении документов и формировании отчетов. Работа tempdb на одном диске с ОС приводит к огромным задержкам.

Выполним перенос базы tempdb на отдельный физический диск (желательно SSD) и оптимизируем количество ее файлов:

  1. Количество файлов данных базы tempdb должно быть строго равно числу логических ядер процессора (в нашем случае — 4 файла). Это предотвратит взаимные блокировки при записи во временные таблицы (allocation bottlenecks).
  2. Размер всех файлов данных должен быть одинаковым, а шаг авторасширения зафиксирован (например, по 256 МБ), чтобы SQL Server распределял нагрузку между файлами строго равномерно.

Применим изменения с помощью SQL-скрипта:


USE master;
GO
-- Переносим основной файл данных
ALTER DATABASE tempdb 
MODIFY FILE (NAME = tempdev, FILENAME = 'D:\SQL_TempDB\tempdb.mdf', SIZE = 1024MB, FILEGROWTH = 256MB);
GO
-- Переносим лог транзакций
ALTER DATABASE tempdb 
MODIFY FILE (NAME = templog, FILENAME = 'D:\SQL_TempDB\templog.ldf', SIZE = 512MB, FILEGROWTH = 128MB);
GO
-- Добавляем дополнительные файлы данных (для 4-ядерного процессора создаем еще 3 файла)
ALTER DATABASE tempdb ADD FILE (NAME = tempdev_2, FILENAME = 'D:\SQL_TempDB\tempdb_2.ndf', SIZE = 1024MB, FILEGROWTH = 256MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev_3, FILENAME = 'D:\SQL_TempDB\tempdb_3.ndf', SIZE = 1024MB, FILEGROWTH = 256MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev_4, FILENAME = 'D:\SQL_TempDB\tempdb_4.ndf', SIZE = 1024MB, FILEGROWTH = 256MB);
GO

Для вступления изменений в силу потребуется перезапустить службу MS SQL Server.

Для MS SQL Server 2008 критически важно прописать в параметрах запуска службы флаги трассировки -T1117 (одновременное расширение всех файлов в группе) и -T1118 (выделение полных экстентов вместо смешанных). Это полностью решит проблему конкуренции за SGAM-страницы распределения памяти.

Шаг 2. Включение режима версионирования строк (RCSI)

В отраслевых базах 1С пользователи часто сталкиваются с взаимными блокировками при проведении документов. По умолчанию MS SQL Server использует классический режим блокировок, при котором читающие запросы (например, построение отчета) блокируют запись новых данных, а пишущие транзакции (проведение документа) заставляют читателей ждать.

Переведем базы данных в режим Read Committed Snapshot Isolation (RCSI). В этом режиме читающие транзакции будут получать согласованную версию данных из базы tempdb, не накладывая блокировок на таблицы. Это кардинально ускорит проведение документов при параллельной работе пользователей.

Для включения режима RCSI выполним следующий скрипт (предварительно монопольно отключив всех пользователей от базы данных):


-- Переводим базу в однопользовательский режим, сбрасывая активные соединения
ALTER DATABASE [Имя_Вашей_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- Включаем режим версионирования строк
ALTER DATABASE [Имя_Вашей_Базы] SET READ_COMMITTED_SNAPSHOT ON;
GO
-- Возвращаем многопользовательский режим обратно
ALTER DATABASE [Имя_Вашей_Базы] SET MULTI_USER;
GO

Внимание: использование RCSI повышает нагрузку на базу tempdb, поэтому выполнение первого шага по оптимизации и переносу tempdb на быстрый SSD является обязательным условием!

Шаг 3. Изоляция рабочих процессов на сервере 1С

Проанализируем состояние сервера приложений 1С. По умолчанию кластер 1С может направлять запросы к разным информационным базам в один и тот же рабочий процесс rphost.exe. Это приводит к тому, что кэш метаданных и оперативная память разных баз смешиваются в рамках одного процесса. База, запущенная первой, захватывает ресурсы процесса, а сеансы второй базы начинают ожидать своей очереди.

Настроим изоляцию информационных баз на сервере приложений 1С:

  1. Откроем консоль «Администрирование серверов 1С Предприятия».
  2. Перейдем в свойства нашего центрального сервера (рабочего сервера) в кластере.
  3. Найдем параметр «Количество ИБ на процесс». По умолчанию там может стоять значение «8» или «0» (без ограничений). Установим строго значение 1.
  4. Параметр «Количество соединений на процесс» рекомендуется уменьшить со стандартных 128 до 25–50 для высоконагруженных баз.

Благодаря этой настройке сервер 1С будет принудительно создавать индивидуальные процессы rphost.exe под каждую информационную базу. Это исключит взаимное влияние баз друг на друга на уровне сервера приложений.

Шаг 4. Оптимизация сетевого взаимодействия и устранение «посредников»

Когда сервер 1С и СУБД разнесены по разным компьютерам, сетевые задержки (Network Latency) начинают оказывать колоссальное влияние на производительность. При проведении одного документа 1С может отправлять к СУБД десятки тысяч мелких SQL-запросов. Если сетевая задержка на один пакет составляет даже 1 миллисекунду, суммарное время ожидания сети при проведении документа составит десятки секунд!

Для минимизации задержек выполним следующие действия:

Резюме проведенных работ

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

  1. Изолируем рабочие процессы rphost.exe на сервере 1С, чтобы базы не мешали друг другу.
  2. Перенесем и ускорим базу временных таблиц tempdb, устранив дисковые задержки СУБД.
  3. Переведем базы в режим RCSI, полностью избавившись от взаимных блокировок пользователей при проведении документов.
  4. Очистим сетевой канал между серверами от фильтрующего ПО, снизив latency до физического минимума.

Эти действия позволят выжать максимум из имеющегося серверного оборудования и обеспечат комфортную работу пользователей без затрат на покупку дорогостоящего железа.

← На главную