Каждый администратор и разработчик систем на базе «1С:Предприятие» рано или поздно сталкивается с парадоксальной ситуацией: тяжелый отчёт (например, «Обороты счета по месяцам» в конфигурации «Управление производственным предприятием») на локальном компьютере пользователя формируется за 23 секунды, при запуске через терминальный сервер Citrix — за 40 секунд, а непосредственно на мощном сервере приложений 1С процесс затягивается до целой минуты! Казалось бы, многопроцессорный сервер с огромным объемом оперативной памяти должен справляться с задачами мгновенно, но на практике мы видим обратную картину.
В этой статье мы подробно проанализируем эту ситуацию, разберем архитектурные особенности платформы 1С, изучим влияние виртуализации на производительность однопоточных вычислений и предоставим пошаговый план решения проблемы.
Для того чтобы понять природу этой проблемы, нам необходимо вспомнить, как устроена клиент-серверная архитектура «1С:Предприятия 8» при работе с обычными формами (что характерно для УПП). В отличие от управляемого приложения, где большинство вычислений можно принудительно перенести на сервер, в обычных формах логика распределяется иначе.
Проанализируем путь выполнения задачи:
1cv8.exe) отправляет запрос на сервер приложений 1С.1cv8.exe). Сюда входит: обход выборок в циклах, заполнение областей макета, вычисление итогов, оформление ячеек, расчет высоты строк, добавление расшифровок и построение итогового объекта ТабличныйДокумент.Таким образом, основное время формирования отчета уходит не на работу с базой данных, а на обработку полученного массива информации и отрисовку интерфейса. И эта ресурсоемкая вычислительная задача полностью ложится на плечи процессора того компьютера, на котором запущен клиент 1С.
Выясним причину, почему локальный офисный ПК оказывается быстрее серверных платформ. Обратим внимание на конфигурацию процессоров:
Построение табличного документа в 1С выполняется строго в один поток. Платформа не умеет распараллеливать заполнение одного макета на несколько ядер процессора. В этой ситуации решающую роль играет производительность процессора на одно ядро (Single-Thread Performance).
Десктопный процессор Core i3 работает на стабильной физической частоте 3.2 ГГц. В то же время серверные процессоры Xeon семейства E5 ориентированы на многопоточность — они содержат много ядер, но каждое отдельное ядро работает медленнее. Более того, в среде виртуализации (VMware ESXi, Hyper-V) технология автоматического разгона процессора (Turbo Boost) очень часто работает некорректно или полностью отключена в настройках электропитания физического хоста. В результате виртуальное ядро Xeon на сервере функционирует на своей базовой частоте 2.4 ГГц. Разница в частоте (3.2 ГГц против 2.4 ГГц) в совокупности с накладными расходами на виртуализацию дает двукратное отставание сервера в однопоточных вычислениях.
Рассмотрим подробнее интересную аномалию: инструмент «Замер производительности» в Конфигураторе показывает общее время выполнения кода в 40 секунд, однако по реальному секундомеру с момента нажатия кнопки проходит ровно 1 минута. Куда исчезают еще 20 секунд?
Инструмент «Замер производительности» фиксирует время выполнения только кода на встроенном языке 1С (запросы, циклы, условия). Вне области его видимости остаются следующие критически важные процессы:
На виртуальных серверах Citrix и сервере приложений 1С по умолчанию могут быть включены механизмы оптимизации операционной системы, которые в данном случае работают во вред:
1cv8.exe начинает непрерывно утилизировать 100% одного логического ядра. Служба DFSS расценивает это как попытку монополизации ресурсов и принудительно снижает приоритет данного процесса, чтобы обеспечить отзывчивость сессий других пользователей. В итоге формирование отчета замедляется еще сильнее.Для устранения разницы в скорости формирования отчетов и общего ускорения работы системы «1С:Предприятие» выполним комплекс настроек инфраструктуры.
Необходимо заставить процессоры работать на максимальной тактовой частоте без задержек на динамический разгон.
Balanced или OS Controlled в положение Static High Performance (Максимальная производительность).На серверах терминалов Citrix необходимо запретить операционной системе искусственно занижать приоритет «тяжелых» процессов 1С.
Для этого выполним редактирование системного реестра Windows. Откройте редактор реестра regedit и перейдите по пути:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System
Найдите или создайте параметр типа DWORD с именем EnableCpuQuota и присвойте ему значение 0.
Также можно отключить этот механизм через PowerShell:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System" -Name "EnableCpuQuota" -Value 0
После изменения реестра потребуется перезагрузка терминального сервера.
В настройках виртуальных машин на гипервизоре выделите гарантированные ресурсы под нужды серверов 1С и Citrix:
Если у вас есть доступ к изменению конфигурации, мы можем внести точечные изменения в код формирования отчета, которые существенно снизят нагрузку на процессор при отрисовке интерфейса.
Рассмотрим пример оптимизации вывода табличного документа:
// Перед началом вывода большого отчета отключим авторасчет высоты строк
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтовысотаСтрок = Ложь;
// Отключим отображение сетки и формул на время заполнения
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ВыводитьФормулы = Ложь;
// Производим вывод областей макета в цикле
Пока Выборка.Следующий() Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Выборка);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Включаем сетку обратно только перед показом пользователю
ТабДок.ОтображатьСетку = Истина;
Отключение свойства АвтовысотаСтрок во время построения отчета предотвращает постоянный пересчет геометрических параметров ячеек движком 1С при выводе каждой новой строки, что способно ускорить рендеринг документа в несколько раз.
Разница в скорости работы отчета между локальным клиентом и сервером Citrix — это не мистическая особенность платформы, а закономерный результат разницы физической частоты ядер процессоров, наложенный на особенности архитектуры обычных форм 1С и накладные расходы виртуализации графики. Применив предложенный нами комплекс настроек электропитания, отключения лимитов DFSS и программной оптимизации табличного документа, вы сможете свести эту разницу к минимуму и обеспечить пользователям комфортную и быструю работу со всеми отчетами.