Введение
В ходе исследований проблем производительности систем 1С, решил изложить тезисно основные рекомендации, наблюдения, идеи.Так называемый чек-лист, который поможет вам улучшить характеристики производительности вашей системы. А если они уже используются, то еще раз проверить все по пунктам, поскольку при некоторых действиях они могут отключаться. В статье рассматриваются только настройки для СУБД MS SQL Server и ОС Windows Server.
Итак.
Общие рекомендации по повышению производительности системы.
-
Включаем на сервере СУБД уровни изоляции транзакций ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT
Данная рекомендация хорошо известна и возможно упоминать о ней не стоило было бы, но без нее статья была бы не полной. Повторение - мать учения.
Этот режим позволяет уменьшить ожидания на блокировках чтения, т.к. чтение в транзакции измененных данных в этом случае не ждут завершения изменяющей транзакции, а читают старую версию, которая была до изменения. Для этого необходимо выполнять следующий скрипт SQL, после каждого перезапуска службы сервера 1С и после обновлений конфигурации информационной базы (т.к. платформа 1С при указанных событиях может отключать необходимый уровень изоляции транзакций):
ALTER DATABASE НаименованиеБазы
SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE НаименованиеБазы
SET READ_COMMITTED_SNAPSHOT ON
И да, не стоит сразу бежать проверять, устанавливать данный режим. Если у вас 8.3 без режима совместимости с 8.2, то данный режим включен по умолчанию.
-
Устраняем эскалацию (укрупнение) блокировок
Для устранения большей части избыточных блокировок на СУБД, связанных с эскалацией, можно попробовать использовать такие методы:
-
Установить в настройках СУБД параметр LOCKS, вместо 0.
Когда параметр locks установлен в 0, укрупнение блокировки происходит тогда, когда память, используемая текущими структурами блокировки, достигает 40 процентов от пула памяти компонента Компонент Database Engine . Если параметр locks установлен не в значение 0, укрупнение блокировки происходит, когда количество блокировок достигает 40 процентов от значения, указанного для параметра locks.
-
Включить на сервере СУБД флаг трассировки 1224
Включить можно так:
DBCC TRACEON (1224,-1)
Этот флаг отключает укрупнение блокировок на основе количества блокировок. Стоит отметить, что чересчур активное использование памяти может включить укрупнение блокировок обратно.
-
Ищем документы, которые делают более 10000 записей в 1 регистр за 1 раз.
Если при выполнении одной транзакции записывается более 10000 записей в регистр, тогда это приводит к блокировкам этих регистров полностью (эскалации) и нарушает параллельную работу всех пользователей, которые обращаются к данным этих регистров, в момент выполнения этой транзакции. Для устранения проблем с конфликтами блокировок и избыточными ожиданиями, которые возникают в процессе выполнения таких длительных транзакций, необходимо реализовать в коде конфигурации механизм, который будет фиксировать транзакцию с количеством записей, не более чем по 10000 записей за один раз, для исключения эскалации блокировок на сервере 1С и СУБД. В результате такого механизма, будет существенно повышена параллельность работы пользователей во всей информационной базе. Особенно с операциями, которые используют те же регистры.
-
Повышаем производительность процессора на сервере приложений 1С
Производительность сервера «1С:Предприятие» зависит в большей степени от частоты процессора и частоты памяти. Чтобы повысить производительность текущих процессоров, стоит включить режим Turbo Boost. Необходимо зайти в BIOS сервера, и выключить там пункты, в названии которых есть EIST и C1E. Взамен надо там же найти пункты, связанные с процессором, в названии которых есть Turbo Boost, Intel SpeedStep и включить эти пункты. Если в BIOS есть общее указание режима энергосбережения — включить его в режим максимальной производительности («агрессивный»). -
Большие таблицы
Одной из причин понижающих производительность системы, являются большие размеры таблиц, к которым происходят запросы. Для того чтобы повысить производительность, нужно стремится максимально уменьшить объем базы и таких таблиц. Следует рассмотреть возможность проведения свертки данных в базе,скорее всего данные прошлых периодов не нужны в оперативной работе. По ним можно свернуть остатки, подробные данные по движениям и истории перенести в архив. В качестве альтернативы свертке данных, можно рассмотреть вариант перепроектировки системы таким образом, чтобы объем данных ,хранимый в таблицах, позволял выполнять запросы с требуемой нам скоростью. Для этого необходимо реализовать механизм оперативных и неоперативных данных. Общий подход должен быть следующим – при записи новых данных в информационную базу, данные должны помещаться в регистры оперативного назначения а по истечении временного органичения (месяц,квартал, год) должны перегружаться в архивные регистры , чем достигается скорость доступа к данным и балансируется нагрузка на сервер. Причем данные неоперативных регистров можно хранить в другой базе данных и на другом сервере. Данные служебных регистров, при этом можно просто очищать от устаревшей информации. При реализации данной концепции, может понадобится модернизировать существующие механизмы конфигурации для возможности получения данных из оперативных и архивных регистров. Данная концепция также позволит существенно сократить объем оперативной базы, повысить скорость работы пользователей, повысить легкость ее обслуживания для регламентных заданий СУБД (Обновление статистики, Перестроение или фрагментация индексов), необходимых для поддержания производительности системы на необходимом уровне.
6. Состояние итогов регистров
Ищем таблицы итогов, в которых хранятся нулевые значения. В таких случаях запросы, использующие такие таблицы для выборок, отбирают большое количество не нужных (нулевых) записей! Пересчет итогов за периоды и текущих итогов позволит ускорить операции записи и чтения итогов.
Пересчет текущих итогов можно осуществлять следующими способами:
-
С помощью соответствующего пункта «Тестирование и исправление информационной базы» в конфигураторе.
-
С помощью команды ПересчитатьТекущиеИтоги() встроенного языка для нужных регистров ( в том числе возможна реализация пересчета итогов одновременно по нескольким регистрам и с помощью фоновых или регламентных заданий )