При совместной работе нескольких расчетчиков в базах данных на устаревших архитектурах (таких как «1С:Зарплата и управление персоналом 2.5» или «1С:Медицина. Зарплата и кадры бюджетного учреждения 1.0») часто возникает ситуация, когда один пользователь запускает расчет заработной платы, а остальные расчетчики вынуждены ждать окончания этой операции. Система зависает, производительность падает, а процесс расчета затягивается на несколько дней. Особенно остро эта проблема проявляется, когда вся инфраструктура (сервер СУБД, сервер приложений 1С и терминальный сервер RDP) развернута на одном физическом компьютере под управлением клиентской операционной системы Windows 10.
В этой статье мы подробно проанализируем причины возникновения подобных блокировок и зависаний, а также разберем по шагам комплекс мер по оптимизации работы СУБД MS SQL Server, операционной системы и самой конфигурации 1С для восстановления комфортной многопользовательской работы.
Прежде чем переходить к настройкам, давайте разберем физику процесса. В рассматриваемой конфигурации (ЗБУ 1.0 / ЗУП 2.5) по умолчанию используется автоматический режим управления блокировками. Это накладывает серьезные ограничения на параллельную работу:
TABLOCKX) всю таблицу целиком. В этот момент любой другой расчетчик, пытающийся провести свой документ, встает в очередь ожидания.Рассмотрим подробнее пошаговый план решения этой проблемы, начиная от простых системных настроек и заканчивая методическими изменениями в работе пользователей.
Для того чтобы читающие запросы (отчеты, расчетные листки, кадровые списки) не блокировались пишущими транзакциями (проведение расчетов), и наоборот, необходимо перевести базу данных в режим snapshot-изоляции (Read Committed Snapshot Isolation). Это позволит СУБД отдавать читающим пользователям согласованные версии строк из временной базы данных tempdb без наложения реальных блокировок на таблицы базы.
Выполним этот переход. Для этого откроем SQL Server Management Studio (SSMS), создадим новый запрос к нашей базе данных и выполним следующий скрипт:
ALTER DATABASE [Имя_Вашей_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [Имя_Вашей_Базы] SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE [Имя_Вашей_Базы] SET MULTI_USER;
Важное примечание: Этот шаг существенно облегчит жизнь кадровикам и тем расчетчикам, которые формируют отчеты во время проведения документов. Однако он не решает проблему на 100%, если два расчетчика одновременно пытаются производить запись в одни и те же таблицы регистров. Перейдем к оптимизации ресурсов сервера.
По умолчанию в MS SQL Server параметр Max Degree of Parallelism (MAXDOP) равен 0. Это означает, что один «тяжелый» запрос на расчет заработной платы может задействовать все доступные ядра процессора (в нашем случае — все 8 вычислительных потоков процессора i7). В результате СУБД монополизирует процессорное время, вызывая взаимные ожидания потоков (CXPACKET) и парализуя работу остальных 11 терминальных сессий.
Для оптимизации работы систем на платформе 1С настроим параметры параллелизма СУБД. Рекомендуется установить максимальную степень параллелизма для одного запроса равной 1. Выполним в SSMS следующий скрипт:
EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure N'max degree of parallelism', N'1' RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure N'cost threshold for parallelism', N'50' RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure N'show advanced options', N'0' RECONFIGURE WITH OVERRIDE;
GO
Установка max degree of parallelism в значение 1 гарантирует, что один сложный запрос будет обрабатываться в рамках одного процессорного ядра, оставляя остальные ресурсы свободными для других пользователей.
Когда СУБД, Сервер 1С (процессы rphost.exe) и терминальные сессии пользователей работают в рамках одной операционной системы с объемом ОЗУ 32 Гб, может произойти критическое исчерпание памяти. Каждая запущенная сессия 1С в режиме терминала потребляет около 1-1.5 Гб памяти. 12 активных пользователей заберут до 18 Гб ОЗУ. Серверу приложений 1С требуется еще около 4 Гб, операционной системе — 2-3 Гб.
Если СУБД SQL Server не ограничить, она захватит всю оставшуюся и доступную память под свой кэш (Buffer Pool). Это приведет к тому, что Windows начнет сбрасывать данные RDP-сессий и процессов 1С в файл подкачки (pagefile.sys) на SSD, вызывая катастрофические задержки ввода-вывода.
Проанализируем доступные ресурсы и установим жесткий лимит для SQL Server на уровне 8 Гб (8192 Мб). Выполним скрипт:
EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure N'max server memory (MB)', N'8192' RECONFIGURE WITH OVERRIDE;
GO
EXEC sys.sp_configure N'show advanced options', N'0' RECONFIGURE WITH OVERRIDE;
GO
Это гарантирует стабильную работу операционной системы и предотвратит уход процессов 1С в виртуальную память (своп).
Поскольку в системе используется единственный SSD-накопитель объемом 120 Гб, на нем одновременно лежат операционная система, файлы баз данных 1С (.mdf и .ldf), а также временная база данных СУБД tempdb. В режиме включенной snapshot-изоляции нагрузка на tempdb возрастает многократно, так как именно туда пишутся версии строк при изменениях.
Для ускорения дисковых операций выполним следующие действия:
tempdb создается с одним файлом данных. Нам необходимо разбить ее на несколько файлов одинакового размера (рекомендуется создавать количество файлов, равное числу физических ядер процессора — в нашем случае 4 файла). Это устранит внутреннюю конкуренцию СУБД за распределение страниц (проблемы SGAM/PFS). Выполним скрипт реорганизации:
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 2048MB, FILEGROWTH = 512MB);
-- Добавляем дополнительные файлы (пути укажите актуальные для вашей системы)
ALTER DATABASE tempdb ADD FILE (NAME = tempdev2, FILENAME = 'C:\SQLData\tempdb2.ndf', SIZE = 2048MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev3, FILENAME = 'C:\SQLData\tempdb3.ndf', SIZE = 2048MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev4, FILENAME = 'C:\SQLData\tempdev4.ndf', SIZE = 2048MB, FILEGROWTH = 512MB);
.ldf) и снизит нагрузку на запись на единственный SSD:
ALTER DATABASE [Имя_Вашей_Базы] SET RECOVERY SIMPLE;
tempdb и файлы логов транзакций рабочей базы. Это физически разделит потоки чтения и записи.Использование клиентской Windows 10 с неофициальными патчами для многопользовательского RDP-доступа несет в себе скрытые проблемы с распределением приоритетов процессов:
. или localhost). СУБД автоматически перейдет на протокол работы через общую память (Shared Memory), что ускорит обмен данными между 1С и SQL на 15–20%.Даже самые лучшие настройки оборудования и СУБД не помогут, если пользователи продолжат работать неэффективно. Проанализируем алгоритм работы расчетчиков и внесем организационные изменения:
-- Обновление статистик для всей базы данных
EXEC sp_updatestats;
Регулярное выполнение этих шагов позволит полностью ликвидировать проблему взаимных блокировок и сократить время расчета заработной платы в организации с нескольких дней до пары часов.