Диагностика быстродействия 1С: с чего начать и чем мерить

· 9 мин

Содержание

Когда база «тормозит», первый вопрос — что именно замерять. Для одной медленной обработки хватит встроенного замера в конфигураторе за пять минут. Для редких провалов «у всех сразу» нужен технологический журнал и счётчики сервера. А чтобы понять, виновата 1С или СУБД, замеряют оба слоя одновременно.

Инструменты диагностики производительности делятся на три уровня: код конфигурации, сервер приложений 1С и СУБД. Ниже — какой из них включать в каждом случае, какие цифры снимать и как их читать. Все пути приведены для платформы 8.3 в интерфейсе «Такси».

Какой инструмент выбрать для замера?

Встроенный замер в конфигураторе: быстрый способ найти узкое место

Самый дешёвый инструмент встроен в платформу и не требует прав администратора кластера. Открывается он в конфигураторе: Отладка → Замер производительности.

Порядок простой:

  1. В конфигураторе выполните Отладка → Замер производительности.
  2. Подключитесь к сеансу, где воспроизводится проблема (кнопка подключения к предмету отладки).
  3. Нажмите «Начать замер» и повторите медленное действие в пользовательском сеансе — открытие формы, проведение документа, формирование отчёта.
  4. Остановите замер.

На выходе — таблица строк кода с количеством вызовов и временем: отдельно чистое время строки и с учётом вложенных вызовов. Сортировка по времени сразу выводит наверх самый тяжёлый участок — чаще всего это запрос в цикле или обращение к реквизиту через точку в большом наборе.

Замер показывает относительную картину: под отладкой код идёт медленнее обычного, поэтому сравнивайте строки между собой, а не с «нормой».

Этот способ отвечает на вопрос «где в коде тратится время», но не видит блокировок и нагрузки на диск. Для них нужны инструменты уровнем ниже.

APDEX и тест Гилёва: как получить объективную цифру

Чтобы спорить о быстродействии не на уровне «кажется, стало медленнее», нужна повторяемая метрика. Их две.

Оценка производительности (APDEX) — подсистема библиотеки стандартных подпрограмм. Включается в разделе Администрирование (пункт «Оценка производительности» появляется после включения соответствующей настройки). После включения платформа фиксирует время ключевых операций, которые заданы в справочнике, и по ним считает индекс APDEX от 0 до 1.

Формула простая: операции делятся на «уложившиеся в целевое время», «терпимые» (до четырёх целевых) и «провальные». Индекс = (число хороших + половина терпимых) / общее число замеров. Чем ближе к единице — тем лучше. Для каждой операции задают своё целевое время: открытие списка — доли секунды, тяжёлый отчёт — десятки секунд.

Тест Гилёва (TPC-1C) — бесплатная внешняя обработка, которая прогоняет синтетический сценарий и выдаёт одно число — условные баллы («попугаи»). Он не ищет причину, но даёт базовую точку: запустили до изменений, запустили после — видно, помогло или нет. Полезен и для сравнения серверов перед покупкой.

Тест Гилёва меряет среду в моменте: при фоновой нагрузке цифра занижена. Запускайте его в один и тот же час и в пустой базе-копии, иначе числа несравнимы.

Технологический журнал: ловим долгие запросы и ожидания

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

Настраивается ТЖ файлом logcfg.xml. Для серверной базы он кладётся в папку conf каталога установки платформы (например, C:\Program Files\1cv8\conf\logcfg.xml) и действует на все процессы кластера. Перезапуск службы не нужен — платформа подхватывает файл в течение минуты.

Минимальный конфиг, который ловит запросы к СУБД дольше секунды:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\v8log" history="4">
        <event>
            <eq property="name" value="DBMSSQL"/>
            <ge property="duration" value="1000000"/>
        </event>
        <property name="all"/>
    </log>
</config>

Здесь duration указывается в микросекундах, то есть 1000000 ≈ 1 секунда, а history="4" хранит журнал 4 часа. Какие события обычно собирают:

  • 🐘 DBMSSQL, SDBL — запросы к СУБД и язык запросов платформы: ищем долгие.
  • 🔒 TLOCK, TTIMEOUT, TDEADLOCK — установка управляемых блокировок, таймауты и взаимоблокировки.
  • 💥 EXCP — исключения, в том числе фоновые падения.
  • 📞 CALL, SCALL — серверные вызовы: видно, что инициировало долгую операцию.

Технологический журнал без фильтра забивает диск гигабайтами за минуты. Всегда ставьте отбор по duration или по конкретному событию и ограничивайте history.

Собранный ТЖ разбирают не глазами, а утилитами разбора журнала или скриптами — в сыром виде это сотни тысяч строк. Включили, воспроизвели проблему, сразу выключили (убрали файл или оставили пустой <config/>).

Сервер приложений 1С: процессы rphost, rmngr и ragent

На серверной базе за работу отвечают три типа процессов, и у каждого своя роль при диагностике:

  • ragent — агент сервера, точка входа, слушает порт 1540. Через него работает консоль администрирования.
  • rmngr — менеджер кластера, порт 1541. Ведёт список сеансов и распределяет нагрузку.
  • rphost — рабочий процесс, в нём исполняется код и живут сеансы. Портов у рабочих процессов несколько, диапазон задаётся в свойствах рабочего сервера.

Смотреть на них удобнее всего из консоли администрирования серверов (оснастка MMC) или из консоли кластера. Там по каждому сеансу видно текущий вызов, захваченную память, количество обращений к СУБД. Если один rphost раздувается по памяти — ищите сеанс с утечкой через неосвобождённые временные таблицы или огромные выборки.

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

Перезапуск службы «Агент сервера 1С» или принудительное завершение rphost обрывают все активные сеансы пользователей и откатывают незавершённые транзакции. Делайте это только в согласованное технологическое окно, а не «на горячую» в рабочий день.

Профилирование СУБД: SQL Server и PostgreSQL

Если ТЖ показал, что время уходит в событии DBMSSQL, дальше копают на стороне СУБД. Инструменты зависят от сервера.

Для Microsoft SQL Server:

  • Расширенные события (Extended Events) — штатная замена устаревшего SQL Server Profiler, грузит сервер меньше.
  • Хранилище запросов (Query Store) — копит статистику по планам и регрессиям, удобно ловить «вчера работало, сегодня нет».
  • Динамические представления (DMV) sys.dm_exec_query_stats, sys.dm_os_wait_stats — топ тяжёлых запросов и типы ожиданий.
  • Монитор активности (Activity Monitor) в SSMS — быстрый взгляд на текущую нагрузку.

Для PostgreSQL (включая сборки 1С):

  • Расширение pg_stat_statements — накопительная статистика по запросам: суммарное время, число вызовов, среднее.
  • Модуль auto_explain и параметр log_min_duration_statement в postgresql.conf — логирование планов долгих запросов.
  • Представление pg_stat_activity — что выполняется прямо сейчас.
  • Утилита pgBadger — сводный отчёт по логам.

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

Системные счётчики через PerfMon

Чтобы отделить «1С медленная» от «железо не тянет», на Windows снимают счётчики производительности системным монитором (perfmon.exe). Он есть в любом Windows Server 2016 и новее, данные пишутся в набор сборщиков по расписанию.

Базовый набор счётчиков для сервера 1С и СУБД:

РесурсСчётчикНа что смотреть
ДискPhysicalDisk \ Avg. Disk sec/Read и /Writeзадержка выше 10–20 мс — диск узкое место
ДискPhysicalDisk \ Current Disk Queue Lengthстабильно длинная очередь — не справляется
ПамятьMemory \ Available MBytesпадает к нулю — не хватает ОЗУ
ПамятьMemory \ Pages/secвысокий своп — сервер «пухнет»
ПроцессорProcessor \ % Processor Timeдолго у 100% — упор в CPU
SQL ServerBuffer Manager \ Page life expectancyрезкие провалы — данные вытесняются из кэша

Счётчики снимают не точечно, а интервалом хотя бы в полчаса под реальной нагрузкой — иначе провал видно, а причину нет. Диск почти всегда оказывается первым подозреваемым для баз 1С — именно задержки ввода-вывода чаще всего превращаются в «тормоза» на стороне пользователя.

Блокировки и взаимоблокировки

Отдельный класс проблем — когда база не загружена, процессор свободен, а документы проводятся по минуте. Это ожидания на блокировках.

В технологическом журнале их видно по событиям:

  • TLOCK — установка и снятие управляемой блокировки.
  • TTIMEOUT — сеанс не дождался блокировки и упал по таймауту.
  • TDEADLOCK — взаимоблокировка: два сеанса ждут ресурсы друг друга, платформа разрывает одного.

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

Для системного разбора блокировок применяют Центр управления производительностью (ЦУП) из корпоративного инструментального пакета (КИП) — он сопоставляет события ТЖ и показывает дерево ожиданий наглядно. Типовое лечение — не «убрать блокировку любой ценой», а сократить время транзакции: убрать запросы и внешние вызовы изнутри проведения, выстроить одинаковый порядок обращения к данным в конкурирующих операциях.

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

Сводная таблица: инструмент под задачу

ИнструментЧто меряетКогда применять
Замер в конфигураторевремя строк кода и вызововмедленная операция у одного пользователя
Оценка производительности (APDEX)индекс по ключевым операциямрегулярный контроль «в целом»
Тест Гилёвасинтетический балл средысравнение «до/после», выбор сервера
Технологический журналзапросы, блокировки, исключенияплавающие проблемы, нагрузка «у всех»
Консоль кластерасеансы, память, вызовы rphostутечки памяти, зависшие сеансы
Профилировщик СУБДпланы и статистика запросовдолгие события DBMSSQL/DBPOSTGRS
PerfMonдиск, память, процессорподозрение на железо и ОС

Логика простая: сверху вниз — от кода к серверу и СУБД. Начинают с дешёвого замера, а тяжёлую артиллерию (ТЖ, профилировщик, PerfMon) включают, когда проблема не локализуется на уровне одной операции.

Частые вопросы

Сколько времени можно держать включённым технологический журнал?
Ровно столько, сколько нужно воспроизвести проблему — обычно минуты. С широким фильтром он пишет гигабайты в час и способен заполнить системный диск. Включили, поймали событие, сразу выключили и следите за свободным местом в каталоге location.
Тест Гилёва показал мало баллов — это точный диагноз?
Нет, это сигнал, а не причина. Низкий балл говорит, что среда медленная, но не уточняет, виноват диск, СУБД, сеть или настройка. После теста переходите к счётчикам и профилировщику, чтобы найти конкретное узкое место.
Чем APDEX отличается от замера в конфигураторе?
APDEX — это постоянный интегральный показатель по заранее выбранным операциям в рабочей базе под реальной нагрузкой. Замер в конфигураторе — разовое вскрытие конкретной операции под отладкой с детализацией до строки кода. Первый отвечает «насколько хорошо в целом», второй — «где именно тормозит».
Влияет ли сам замер на производительность базы?
Да. Отладка замедляет исполняемый код, широкий технологический журнал грузит диск, а профилировщик СУБД добавляет нагрузку на сервер базы данных. Поэтому замеры с заметными накладными расходами проводят адресно и выключают сразу после сбора данных.
Нужен ли отдельный сервер СУБД для нормального быстродействия?
Для небольших баз и десятка пользователей сервер 1С и СУБД уживаются на одной машине. На крупных базах их разносят, чтобы конкуренция за память и диск не била по обоим. Но прежде чем покупать железо, снимите счётчики — часто упор не в мощность, а в медленный диск или неоптимальные запросы.