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

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

В процессе разработки и оптимизации высоконагруженных систем на платформе «1С:Предприятие 8» программисты часто сталкиваются с неочевидным поведением производительности. Одним из таких парадоксов является разница в скорости выполнения серверных вызовов из-под различных клиентских приложений. Проведем детальный анализ ситуации, когда 1000 последовательных «пустых» серверных вызовов выполняются на тонком клиенте почти в два раза быстрее, чем на толстом клиенте в режиме обычного приложения.

Разберем по шагам технические причины этого явления, проанализируем влияние сетевой инфраструктуры и протоколов отладки, а также выработаем практические рекомендации по снижению задержек (latency) при клиент-серверном взаимодействии.

Суть эксперимента и аномалия замеров

Для понимания масштаба проблемы рассмотрим классический тест производительности. На стороне клиента в цикле выполняется 1000 обращений к экспортной функции серверного общего модуля. Функция не делает никаких запросов к базе данных SQL и просто возвращает пустую строку:


Функция ПолучитьПустуюСтрокуСервера() Экспорт
    Возврат "";
КонецФункции

При замере времени выполнения этого цикла на одной и той же аппаратной конфигурации (сервер приложений и СУБД находятся на мощном сервере, клиент — на рабочей станции, объединенной гигабитной сетью) получаются следующие результаты:

На первый взгляд результат кажется парадоксальным. Толстый клиент исторически считается более «мощным» и функциональным. Почему же накладные расходы на простейший вызов в нем оказываются значительно выше? Выясним истинные причины этой архитектурной особенности платформы 1С.

Причина 1. Влияние протокола отладки (DBGS) и конфигуратора

Проанализируем наиболее частую ошибку при проведении подобных тестов. Как справедливо отмечено в обсуждении, замеры, проводимые внутри сеанса, запущенного из Конфигуратора (в режиме отладки), будут кардинально отличаться от работы системы в реальных условиях.

В платформе «1С:Предприятие 8.3» по умолчанию используется HTTP-протокол отладки. Когда клиентское приложение запущено под отладчиком:

  1. Каждое сетевое событие и каждый серверный вызов сопровождаются дополнительным служебным обменом с сервером отладки (процесс dbgs).
  2. Платформа вынуждена передавать на сервер отладки информацию о текущем стеке вызовов, проверять наличие активных точек останова и актуализировать состояние локальных переменных.
  3. Из-за сложной внутренней структуры толстого клиента (процесс 1cv8.exe) синхронизация состояния с отладочным сервером занимает гораздо больше времени, чем у легковесного тонкого клиента (процесс 1cv8c.exe).

Если запустить тесты на клиентах без использования режима отладки (и тем более с отключенной отладкой на самом сервере приложений 1С с помощью ключа запуска службы без параметра -debug), разница в чистом времени отклика между клиентами существенно сократится, а общее время выполнения теста упадет в разы.

Причина 2. Архитектура процессов и контекстное переключение (Context Switch)

Сравним физический «вес» исполняемых файлов клиентских приложений:

С точки зрения операционной системы Windows, планировщик процессора тратит значительно больше ресурсов на обслуживание потоков тяжелого процесса 1cv8.exe. Контекстное переключение (Context Switch) при обработке сетевых сокетов, получении пакета ответа от сервера приложений 1С и передаче его обратно интерпретатору встроенного языка в толстом клиенте занимает микроскопически больше времени. При единичном вызове эта разница неощутима, но при циклическом повторении операции 1000 раз задержки суммируются в секунды.

Причина 3. Механизмы сериализации данных

При вызове серверного метода платформа выполняет сериализацию переданных параметров, а при возврате значения — десериализацию результата на стороне клиента. Тонкий клиент изначально проектировался под веб-стандарты и работу по относительно медленным каналам связи. Форматы передачи данных для управляемого приложения (XDTO, оптимизированные бинарные потоки) максимально сжаты и адаптированы для быстрой обработки.

В толстом клиенте (особенно в обычном приложении) для сохранения обратной совместимости со старыми конфигурациями и COM-компонентами могут использоваться более тяжелые механизмы сериализации. Платформа передает избыточный служебный контекст (например, состояние глобального модуля, информацию о транзакциях и COM-соединениях), что увеличивает объем пересылаемых по сети байтов и нагрузку на процессоры клиента и сервера при их разборе.

Причина 4. Алгоритм Нагла (TCP Nagle's Algorithm) и сетевые задержки

При выполнении множества последовательных микро-запросов (когда объем полезных данных равен нулю, как в случае с пустой строкой) ключевым фактором становится не пропускная способность сети (1 Гбит/с), а задержка доставки пакета (Round Trip Time, RTT).

По умолчанию в сетевом стеке операционных систем семейства Windows включен алгоритм Нагла. Этот алгоритм предназначен для уменьшения количества мелких пакетов в сети: он задерживает отправку маленького TCP-пакета до тех пор, пока от получателя не придет подтверждение приема предыдущего пакета или пока не накопится достаточный объем данных для отправки. При частых синхронных вызовах это может приводить к искусственным задержкам до 200 мс на каждый физический пакет.

Поведение сетевых сокетов для процессов 1cv8.exe и 1cv8c.exe может отличаться из-за внутренних настроек сетевых библиотек, используемых платформой, что также накладывает свой отпечаток на итоговую скорость.

---

Как уменьшить задержку серверных вызовов и повысить производительность?

Рассмотрим комплекс мер, направленных на минимизацию времени реакции сервера и оптимизацию клиент-серверного взаимодействия в вашей конфигурации.

1. Главное правило — пакетирование вызовов

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

Посмотрим на пример неоптимального кода:


// НЕОПТИМАЛЬНО: 1000 обращений к серверу по сети
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
    Цена = ПолучитьЦенуНаСервере(СтрокаТовара.Номенклатура);
    СтрокаТовара.Цена = Цена;
КонецЦикла;

Перепишем этот алгоритм с использованием пакетирования данных:


// ОПТИМАЛЬНО: 1 обращение к серверу по сети
МассивНоменклатуры = ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура");
СоответствиеЦен = ПолучитьТаблицуЦенНаСервере(МассивНоменклатуры);

Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
    СтрокаТовара.Price = СоответствиеЦен.Получить(СтрокаТовара.Номенклатура);
КонецЦикла;

Один серверный вызов, длящийся 100 миллисекунд, всегда отработает быстрее и потребует меньше ресурсов процессора, чем 1000 вызовов по 2 миллисекунды.

2. Использование внеконтекстных серверных вызовов

Если вы работаете в управляемом приложении (Тонкий клиент), при объявлении процедур и функций в модуле формы обязательно используйте директиву компиляции &НаСервереБезКонтекста вместо обычного &НаСервере.


&НаСервереБезКонтекста
Функция ПолучитьДанныеБезКонтекста(Параметр)
    // Данный вызов не передает данные формы (реквизиты, элементы управления) на сервер.
    // Сетевой трафик минимален.
    Возврат Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Параметр);
КонецФункции

При контекстном вызове (&НаСервере) платформа сериализует состояние всей формы и передает его на сервер приложений, а затем возвращает измененный контекст обратно на клиент. При наличии тяжелых табличных частей на форме это вызывает колоссальные задержки.

3. Настройка сетевых адаптеров на клиенте и сервере

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

  1. Отключите функции энергосбережения сетевого адаптера (Energy Efficient Ethernet, Green Ethernet). Перевод сетевой карты в режим пониженного энергопотребления во время микропауз вызывает задержки при возобновлении передачи данных.
  2. В свойствах сетевой карты переведите параметр «Схема электропитания» в режим «Максимальная производительность».
  3. Обновите драйверы сетевых плат до актуальных версий от производителя (Intel, Realtek и др.), избегая стандартных драйверов Microsoft, поставляемых вместе с операционной системой.

4. Исключение процессов 1С из сканирования антивирусов

Тяжелый процесс толстого клиента 1cv8.exe часто вызывает повышенный интерес со стороны систем проактивной защиты и антивирусного ПО. Антивирус может перехватывать и анализировать каждый сетевой сокет, открываемый процессом, что приводит к значительным задержкам при серийных вызовах.

Добавьте следующие исполняемые файлы в список исключений вашего антивируса на клиентских машинах и на сервере приложений:

Также рекомендуется внести в исключения сканирования каталоги временных файлов пользователей (%TEMP%), куда платформа активно кэширует конфигурацию и метаданные при запуске и работе.

← На главную