К статье
Практический материал

Администрирование · 11 мин

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

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

1С загружает одно ядро на 100 % при общей загрузке процессора 5–10 %, потому что большинство операций платформы — проведение документа, закрытие месяца, формирование отчёта — выполняются в одном потоке и физически не могут быть распределены между ядрами. Сервер с 16 или 32 ядрами в этот момент простаивает, пользователи жалуются на «тормоза», а диспетчер задач показывает, что работает лишь один поток rphost. Это не ошибка установки и не дефект железа, а следствие архитектуры платформы: ускорить такую задачу можно более производительным ядром и оптимизацией кода, но не добавлением новых ядер.

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

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

Как устроено выполнение кода в платформе 1С

Платформа 1С:Предприятие исполняет встроенный код последовательно в рамках одного сеанса. Когда пользователь нажимает «Провести», запускается цепочка: чтение объекта, выполнение обработчиков, запись в базу, контроль остатков. Каждый шаг ждёт завершения предыдущего, поэтому разнести их по разным ядрам невозможно — это не ограничение настройки, а свойство последовательного алгоритма.

Файловый режим работы усугубляет картину: вся база находится в одном файле, доступ к нему блокируется на время операций, и параллельность ограничена ещё сильнее. В клиент-серверном режиме часть нагрузки уходит на СУБД (MS SQL, PostgreSQL), которая умеет задействовать несколько ядер, но одиночный запрос тоже часто выполняется преимущественно одним потоком, если сервер БД не настроен на параллелизм.

Где именно возникает «узкое место» одного ядра

Чаще всего жалобы возникают на типовых сценариях: тяжёлые отчёты за большой период, групповое перепроведение документов, расчёт себестоимости или зарплаты, обмены данными, загрузка больших файлов. Во всех этих случаях один сеанс выполняет длительную последовательную работу, и в диспетчере задач видно характерную картину: один логический процессор на 100 %, остальные почти свободны.

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

Одно ядро на 100 %, остальные свободныОднопоточная операция

Какой сеанс или фоновое задание выполняется в этот момент

Все ядра загружены равномерноМного пользователей или параллельные задачи

Количество активных сеансов и рабочих процессов

Низкая загрузка CPU, но всё тормозитУзкое место не в процессоре

Дисковую подсистему, память, блокировки в СУБД

Роль сервера 1С и рабочих процессов

В клиент-серверном варианте нагрузку обслуживают рабочие процессы rphost. Каждый процесс может обслуживать несколько сеансов, но один сеанс в момент выполнения операции занимает один поток. Если рабочий процесс один, а сеансов много, возникают очереди внутри процесса — и снова видна картина «одного занятого ядра».

Проверьте настройки кластера: количество рабочих процессов на сервер, максимальный объём памяти процесса, число соединений на процесс. Для сервера с большим числом ядер обычно имеет смысл разрешить несколько рабочих процессов, чтобы сеансы распределялись по ним и параллельно использовали разные ядра. Это не ускорит одиночную операцию, но уберёт взаимное ожидание пользователей.

Базовая диагностика загрузки
  1. 1
    Откройте диспетчер задач или монитор ресурсов и посмотрите загрузку по каждому ядру отдельно, а не среднюю
  2. 2
    Определите, какой процесс грузит ядро: rphost, sqlservr, 1cv8 (клиент) или фоновое задание
  3. 3
    В консоли кластера найдите сеанс, которому принадлежит нагрузка, и выясните выполняемую операцию
  4. 4
    Зафиксируйте время выполнения операции до внесения изменений — это точка отсчёта для проверки эффекта

Настройки СУБД: где реально задействовать несколько ядер

Значительная часть тяжёлой работы в клиент-серверной 1С выполняется на стороне СУБД. MS SQL Server умеет распараллеливать запросы, но делает это по внутренним порогам стоимости: дешёвые запросы выполняются одним потоком. Параметры «max degree of parallelism» и «cost threshold for parallelism» определяют, когда запрос разбивается на несколько потоков.

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

Что реально ускоряет однопоточные операции

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

Второй фактор — дисковая подсистема и память. Если операция постоянно читает данные с диска, процессор простаивает в ожидании, и даже одно ядро загружено не полностью. Быстрые NVMe-диски и достаточный объём ОЗУ под кэш СУБД часто дают больший эффект, чем замена процессора.

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

Пути ускорения: что выбрать

Процессор с высокой частотой ядра

Ускоряет любые однопоточные операции без изменения кода; ограничение — стоимость замены железа

Быстрые диски и больше ОЗУ

Помогает, когда есть ожидания диска; бесполезно, если узкое место — чистые вычисления

Оптимизация запросов и кода

Даёт наибольший эффект на конкретных тяжёлых операциях; требует анализа и аккуратного тестирования

Параллельные фоновые задания

Подходит для пакетных задач (обмены, обработки), которые можно разбить на независимые части

Как распараллелить работу штатными средствами

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

Для этого подходят регламентные операции, обмены, загрузка данных, массовые пересчёты. Ограничения: части задачи не должны конфликтовать по данным (иначе возникнут блокировки), а результат нужно корректно собрать воедино. В типовых конфигурациях часть механизмов уже умеет многопоточность — например, некоторые обмены и отложенные обработчики обновления.

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

Типичные ошибки при борьбе с «одним ядром»

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

Вторая ошибка — попытка ускорить работу настройками без диагностики. Без замера невозможно понять, где время: в процессоре, диске, блокировках или коде. Третья ошибка — игнорирование блокировок: иногда «одно ядро на 100 %» у одного сеанса сопровождается ожиданием остальных, и реальная причина медлительности — не процессор, а конкуренция за данные.

Типичные ошибки
01
Покупка многоядерного сервера с низкой частотой ядер — одиночные операции не ускоряются или замедляются
02
Изменение настроек СУБД и кластера без замеров до и после — невозможно понять эффект, легко ухудшить работу
03
Оптимизация кода «вслепую» без технологического журнала — усилия тратятся не на то место
04
Игнорирование блокировок — реальная причина тормозов остаётся нетронутой

Как проверить, что изменения помогли

Любое изменение — настройки СУБД, железо, доработку кода — оценивайте по одному и тому же сценарию: одна и та же операция, одинаковый объём данных, сопоставимая фоновая нагрузка. Замеряйте время выполнения до и после. Разовый замер ненадёжен: делайте несколько прогонов и смотрите среднее.

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

Контрольные точки

Как проверить результат

Время типовой тяжёлой операции
Норма

Сократилось по сравнению с замером до изменений

Тревожный признак

Не изменилось или выросло — узкое место в другом

Загрузка ядер во время операции
Норма

При параллельной схеме занято несколько ядер

Тревожный признак

По-прежнему одно ядро — распараллеливание не сработало

Ожидания и блокировки в СУБД
Норма

Ожидания на блокировках минимальны

Тревожный признак

Рост блокировок — части задачи конфликтуют по данным

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

Почему 1С не сделает все операции многопоточными?

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

Поможет ли переход с файлового режима на клиент-серверный?

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

Сколько рабочих процессов rphost должно быть на сервере?

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

Почему диспетчер задач показывает общую загрузку CPU всего 5 %, а 1С тормозит?

Диспетчер показывает среднюю загрузку по всем ядрам. Одно ядро на 100 % при 16 ядрах даёт около 6 % средней загрузки. Смотрите загрузку по каждому логическому процессору отдельно — там видна реальная картина.

Можно ли ускорить тяжёлый отчёт без доработки конфигурации?

Частично: проверьте индексы и статистику в СУБД, убедитесь, что отчёт не сворачивается в ожидание диска, попробуйте выполнить его в непиковое время. Если отчёт построен на неоптимальном запросе, существенный эффект даст только доработка запроса или схемы компоновки.

Влияет ли виртуализация на проблему одного ядра?

Да. Гипервизор может выделять виртуальной машине ядра с пониженной частотой или с ограничениями планировщика, что напрямую бьёт по однопоточным операциям. Проверьте, что ВМ получает гарантированные ресурсы, а частота процессора хоста достаточна для задач 1С.

Итог

Что важно запомнить

Одно ядро на 100 % — это нормальное поведение однопоточной операции 1С, а не поломка. Диагностируйте узкое место замерами, ускоряйте одиночные операции частотой ядра, быстрыми дисками и оптимизацией запросов, а пакетные задачи разбивайте на параллельные фоновые задания. Любые изменения настроек проверяйте на копии базы и оценивайте по замерам до и после.