Почему база 1С начинает жутко тормозить при достижении 40 и более пользователей?

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

Ситуация, когда серверная инфраструктура кажется избыточной, но при достижении определенного порога подключений (например, 40 сеансов) производительность падает в 5-10 раз, является классической проблемой «бутылочного горлышка». Разберем подробно, почему это происходит и как выявить истинную причину: от настроек «железа» до логических ошибок в программном коде 1С.

Анализ аппаратной части и настроек электропитания

Часто администраторы полагаются на высокую тактовую частоту десктопных процессоров (например, Intel Core i7), забывая о серверных особенностях работы ОС. Проанализируем влияние режима энергосбережения. В Windows Server по умолчанию может быть включен план «Сбалансированный», который динамически меняет частоту ядер. При резком росте нагрузки (заход 40-го пользователя) система не успевает мгновенно «разбудить» ядра, что вызывает микрофризы.

Рассмотрим результаты тестов: переключение в режим «Высокая производительность» в настройках электропитания Windows и отключение состояний C-States в BIOS материнской платы может повысить производительность в тестах (например, тест Гилева) более чем в два раза. Это происходит потому, что процессор перестает тратить время на переходы между энергосберегающими режимами.

Оптимизация MS SQL Server и распределение памяти

Посмотрим на настройки SQL-сервера. Распространенная ошибка — выделение памяти «на глаз». Если база данных имеет размер 150 ГБ, а SQL-серверу выделено всего 16 ГБ из 32 ГБ доступных, система начинает активно использовать файл подкачки и сбрасывать кэш страниц с диска. Проанализируем показатели Buffer Cache Hit Ratio — если этот параметр падает ниже 99%, памяти катастрофически не хватает.

Также важно настроить параллелизм. Для процессоров с малым количеством ядер и высокой частотой (как i7) рекомендуется установить значение Max Degree of Parallelism (MAXDOP) в 1. Это предотвратит ситуацию, когда один тяжелый запрос «размазывается» по всем ядрам, блокируя работу остальных 39 пользователей. Параметр Cost Threshold for Parallelism стоит поднять до 50, чтобы мелкие запросы гарантированно выполнялись на одном ядре.

Логические ошибки в данных: «Проблема 0017 года»

Выясним неочевидную причину тормозов, связанную с итогами регистров. В 1С существует механизм расчета итогов, который обычно работает помесячно. Если в базу попадает документ с опечаткой в дате (например, 0017 год вместо 2017), платформа пытается рассчитать и хранить итоги за каждые 30 дней на протяжении двух тысяч лет.

Проанализируем ситуацию: это порождает миллионы пустых записей в таблицах итогов (_AccumRegTotals...). При любом движении по такому регистру SQL-сервер вынужден пересчитывать огромный массив данных. Для поиска таких «аномалий» воспользуемся внешней обработкой для проверки минимальных дат в регистрах. Если найдены даты ранее начала ведения учета, их необходимо исправить, а итоги — пересчитать на текущую дату.

Архитектурные ограничения RDP и «тонкого клиента»

Разберем, почему совмещение ролей терминального сервера (RDP), сервера 1С и SQL-сервера на одной машине вредно при 40+ пользователях. Каждая RDP-сессия создает нагрузку на видеоподсистему и планировщик задач ОС. Windows Server начинает применять механизмы Fair Share, пытаясь честно распределить ресурсы между всеми 40 пользователями, что приводит к огромному количеству переключений контекста (Context Switches/sec).

Рассмотрим рекомендации по разделению ролей:

  1. Терминальный сервер выносится на отдельную машину или виртуальную среду.
  2. Сервер 1С и SQL остаются на одном мощном узле для использования протокола Shared Memory (LPC), который значительно быстрее TCP/IP.
  3. Если используется конфигурация на обычных формах (например, УТ 10.3), необходимо тщательно следить за объемом оперативной памяти, так как каждый «толстый» клиент потребляет значительный ресурс внутри RDP-сессии.

Анализ кода: избыточные запросы и «спам» в базу

Проанализируем ситуацию с помощью Технологического Журнала (ТЖ). Если 30-40 пользователей генерируют около 13 000 запросов в секунду к SQL-серверу — это явный признак неоптимизированного кода. Выясним причину: часто это запросы внутри циклов или в обработчиках ПриВыводеСтроки (для обычных форм) и УсловноеОформление (для управляемых форм), где запрос выполняется для каждой видимой строки списка.

Пример неоптимизированного кода, который «кладет» базу при росте числа пользователей:


// ОШИБКА: Запрос в цикле при выводе строк списка
Для Каждого Строка Из ОформленияСтрок Цикл
    Запрос = Новый Запрос("ВЫБРАТЬ Остаток ИЗ Регистр.Остатки ГДЕ Номенклатура = &Ном");
    Запрос.УстановитьПараметр("Ном", Строка.ДанныеСтроки.Ссылка);
    // Выполнение запроса для каждой строки!
    Результат = Запрос.Выполнить().Выгрузить();
КонецЦикла;

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

Работа с журналом регистрации и антивирусом

Посмотрим на влияние антивирусного ПО. При активной работе 40 человек сервер 1С постоянно пишет логи в журнал регистрации. Если антивирус проверяет каждый файл .lgd (SQLite) или .lgp при записи, возникают задержки файловых операций. Необходимо добавить в исключения антивируса:

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

Итоговый алгоритм действий

Подведем итог. Чтобы победить тормоза при 40+ пользователях, выполним следующие шаги:

  1. Включим «Высокую производительность» в ОС и BIOS.
  2. Проверим минимальные даты в регистрах с помощью специальных обработок (исключим даты типа 01.01.0001).
  3. Настроим MAXDOP = 1 в SQL Server.
  4. Проанализируем частоту запросов к базе: если она аномально высока, пересмотрим код на наличие запросов в циклах.
  5. Если ресурсов процессора i7 всё равно не хватает (очередь к процессору > 2 на ядро), запланируем переход на многоядерные решения Intel Xeon с большим объемом кэша L3.
← На главную