Почему отчет в 1С на сервере и через Citrix формируется дольше, чем на локальном компьютере?

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

Каждый администратор и разработчик систем на базе «1С:Предприятие» рано или поздно сталкивается с парадоксальной ситуацией: тяжелый отчёт (например, «Обороты счета по месяцам» в конфигурации «Управление производственным предприятием») на локальном компьютере пользователя формируется за 23 секунды, при запуске через терминальный сервер Citrix — за 40 секунд, а непосредственно на мощном сервере приложений 1С процесс затягивается до целой минуты! Казалось бы, многопроцессорный сервер с огромным объемом оперативной памяти должен справляться с задачами мгновенно, но на практике мы видим обратную картину.

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

Архитектурная причина: где на самом деле формируется отчет?

Для того чтобы понять природу этой проблемы, нам необходимо вспомнить, как устроена клиент-серверная архитектура «1С:Предприятия 8» при работе с обычными формами (что характерно для УПП). В отличие от управляемого приложения, где большинство вычислений можно принудительно перенести на сервер, в обычных формах логика распределяется иначе.

Проанализируем путь выполнения задачи:

  1. Пользователь нажимает кнопку «Сформировать».
  2. Клиентское приложение (процесс 1cv8.exe) отправляет запрос на сервер приложений 1С.
  3. Сервер приложений преобразует этот запрос в понятный для СУБД вид (T-SQL) и передает его на SQL-сервер.
  4. SQL-сервер осуществляет выборку данных и возвращает их серверу 1С. Этот этап (выборка данных) в нашем примере занимает всего около 8 секунд из общего времени.
  5. Сервер приложений 1С транслирует «сырые» данные обратно клиенту.
  6. Вся дальнейшая работа выполняется исключительно на стороне клиента (в процессе 1cv8.exe). Сюда входит: обход выборок в циклах, заполнение областей макета, вычисление итогов, оформление ячеек, расчет высоты строк, добавление расшифровок и построение итогового объекта ТабличныйДокумент.

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

Физический Core i3 против виртуального Xeon: битва за один поток

Выясним причину, почему локальный офисный ПК оказывается быстрее серверных платформ. Обратим внимание на конфигурацию процессоров:

Построение табличного документа в 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С (запросы, циклы, условия). Вне области его видимости остаются следующие критически важные процессы:

  1. Сериализация и десериализация данных: Передача больших объемов информации между сервером приложений 1С и клиентом требует упаковки данных во внутренний XML-подобный формат платформы и их последующей распаковки на стороне получателя. Этот процесс сильно нагружает процессор и занимает значительное время при работе в терминальной сессии.
  2. Отрисовка графического интерфейса: Построение сложной сетки табличного документа (вычисление границ ячеек, шрифтов, отображение группировок) выполняется платформой на уровне скомпилированного бинарного кода C++, движка визуализации 1С. Замер производительности встроенного языка этот этап не отслеживает.
  3. Графическая подсистема Citrix и RDP: При формировании отчета на локальном ПК отрисовка интерфейса мгновенно обрабатывается встроенным графическим ядром процессора Core i3. На сервере Citrix виртуальная видеокарта отсутствует или работает в режиме программной эмуляции. Вся нагрузка по 2D-рендерингу интерфейса ложится на центральный процессор (CPU) сервера, который и без того занят выполнением кода 1С. Это создает «бутылочное горлышко», увеличивая итоговое время ожидания пользователя.

Скрытые системные барьеры виртуализации

На виртуальных серверах Citrix и сервере приложений 1С по умолчанию могут быть включены механизмы оптимизации операционной системы, которые в данном случае работают во вред:

Пошаговое руководство по исправлению проблемы и оптимизации

Для устранения разницы в скорости формирования отчетов и общего ускорения работы системы «1С:Предприятие» выполним комплекс настроек инфраструктуры.

Шаг 1. Перевод серверов в режим максимальной производительности

Необходимо заставить процессоры работать на максимальной тактовой частоте без задержек на динамический разгон.

  1. На физических серверах-хостах (где развернуты гипервизоры VMware/Hyper-V) войдите в настройки BIOS/UEFI. В разделе управления питанием (Power Management) переведите режим работы из Balanced или OS Controlled в положение Static High Performance (Максимальная производительность).
  2. Внутри виртуальных машин с Windows Server (как на сервере 1С, так и на серверах Citrix) откройте «Панель управления» -> «Электропитание» и установите схему «Высокая производительность» (High Performance).

Шаг 2. Отключение механизма Dynamic Fair Share Scheduling (DFSS)

На серверах терминалов 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

После изменения реестра потребуется перезагрузка терминального сервера.

Шаг 3. Настройка резервирования процессорных ресурсов (CPU Reservation)

В настройках виртуальных машин на гипервизоре выделите гарантированные ресурсы под нужды серверов 1С и Citrix:

Шаг 4. Оптимизация программного кода формирования отчета

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

Рассмотрим пример оптимизации вывода табличного документа:


// Перед началом вывода большого отчета отключим авторасчет высоты строк
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтовысотаСтрок = Ложь;

// Отключим отображение сетки и формул на время заполнения
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ВыводитьФормулы = Ложь;

// Производим вывод областей макета в цикле
Пока Выборка.Следующий() Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Выборка);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

// Включаем сетку обратно только перед показом пользователю
ТабДок.ОтображатьСетку = Истина;

Отключение свойства АвтовысотаСтрок во время построения отчета предотвращает постоянный пересчет геометрических параметров ячеек движком 1С при выводе каждой новой строки, что способно ускорить рендеринг документа в несколько раз.

Резюме

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

← На главную