1с однопоточная программа или нет

Обновлено: 05.07.2024

Предположим, что программа 1С работает с замедлениями или попросту «тормозит». Как понять, в чем проблема? Куда смотреть? Как правильно определить «узкое место»?

Советы по ускорению работы 1С 8.3 в файловом режиме Советы по ускорению работы 1С 8.3 в файловом режиме

Рекомендации на основе часто встречающихся ошибок:

1. Настройки антивируса «по умолчанию» — ошибка.

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

Укажите в списке исключений:

  • для 1С v7.7 — маски *.md, *.dbf, *.cdx ;
  • для 1С v8 — маску 1Cv8*.1C? (1Cv8.1CD / 1Cv8tmp.1CD / 1Cv8.1CL / 1Cv8tmp.1CL) и файлы 1Cv8.pfl и 1Cv8.log , маски *.epf, *.dt, *.cf, *.cfu ;
  • временные файлы, используемые 1С: Предприятие.

2. Режим производительности . Если нужна скорость, сделайте это обязательно на клиентских и серверных компьютерах.

Включить режим можно в 2-х местах: через BIOS ( Отключить режимы C1, C1E, Intel С-state — C2, C3,C4; перевести в значение «Disabled» ) и в настройках Windows ( «Панель управления — Электропитания — Режим «Высокая производительность» ).

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

3. Включите Turbo Boost , если ваш процессор поддерживает эту функцию.

Максимальный эффект от Turbo Boost проявляется, когда включены C-State. Необходимо проверить влияние параметра для вашего варианта 1С (файловый режим или клиент-сервер). Например, по тесту Гилева.

Условия активации Turbo Boost:

  • BIOS QPI L0s, L1 — « Disabled »;
  • BIOS Demand Scrubbing — « Disabled »;
  • BIOS Intel SpeedStep — « Enabled »;
  • BIOS Turbo Boost — « Enabled »;
  • Windows « Панель управления — Электропитание — Высокая производительность ».

4. Следующее важное звено — сеть .

Перед началом тестирования:

  • убедитесь, что iperf между двумя компьютерами показывает всю полосу;
  • выполнены рекомендации с сайта Гилева ;
  • скопируйте один большой файл (5-10 Гб) по локальной сети и замерьте скорость копирования.

Есть несколько способов, как задать путь к сетевой базе 1С: по имени сервера, по ip-адресу и с подключением сетевого диска (net use). Правильный вариант только один:

Не ip-адрес, а имя сервера. Если сервер не виден по имени, добавьте его в DNS или в файл hosts. Обращение к серверу должно быть по имени, а путь в клиенте 1С — через букву сетевого диска и название каталога.

5. Проверьте формат базы 1С и протестируйте версию 8.3.8 .

Выводы для файлового режима работы:

  1. Локальная сеть должна быть настроена (выполнен тюнинг), а также правильно прописан путь в 1С. Ограничением при работе нескольких (>10) пользователей уже будет выступать не сеть, тут 1 Гбит ещё хватит, а блокировки при многопользовательской работе.
  2. Платформа 1C 8.3 в разы требовательнее к грамотной настройке сети. Влиять может все: деинсталляция (а не просто отключение) антивируса, удаление лишних сетевых протоколов, смена драйверов, от физического удаления второй сетевой карты на сервере.
  3. Настройки антивирусов по умолчанию снижают производительность. Если разрешить процессу 1cv8 делать все, скорость такая же, как и без антивируса.

⚡ Подписывайтесь на канал или задавайте вопрос на сайте — постараемся помочь всеми техническими силами. Безопасной и производительной работы в Windows и 1С.

Vofka --> Vofka



Просмотр профиля

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

Конечно, многопоточность – это не панацея, но это хороший способ для:

2) повышения утилизации ресурсов оборудования.

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

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

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

В этом примере ускорение может быть не очень большим, т.к. формирование документов занимает меньше времени, нежели их проведение.

2) Существует большая база данных с транзакциями по продажам магазинов (из предыдущего примере) и есть необходимость периодически выгружать эти данные в стороннюю BI-систему средствами 1С. Выгрузка инициируется пользователем и занимает длительное время, т.к. системе нужно получить из базы данных миллионы строк и выгрузить их в промежуточную базу для BI. Во время выгрузки данных оборудование загружено несущественно.

В этой ситуации можно было бы распараллелить выгрузку данных – одновременно выгружать данные по разным магазинам. Это существенно ускорит процесс и позволит в полной мере ощутить эффект от мощного железа.

Инструменты встроенного языка для выполнения многопоточной процедуры.

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

Пример кода для второго случая (выгрузка большого массива данных порциями):

1) Процедура, инициирующая многопоточное выполнение кода:

2) Процедура, которую непосредственно выполняет фоновое задание (основная логика):

Общий модуль «ВыгрузкаДанныхНаСервере», выполняемый на сервере:

При этом следует учесть, что к выбору числа параллельных заданий нужно отнестись ответственно – если запустить их даже несколько десятков, то велика вероятность «повесить» и сервер приложений, и сервер СУБД.


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

Теперь опишем управляющую процедуру:

Заключение.

Related Posts

50 Comments

А по факту многопоточность так же внутри одного ядра выполняется?

(4) fancy, это же пример. а по факту потом можно оптимизировать и оптимизировать. Автору спасибо за статью!

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

(7) если не ошибаюсь (что не исключено ;)), один процесс RPHOST выполняется на 1 ядре. И получается все зависит от того, какой RPHOST (если их несколько) будет выполнять тот или иной поток. Ситуация, что все они будут выполнятся на одном и том же рпхосте не исключена. И беда в том, что повлиять на это возможности уже нет (конечно и тут я могу ошибаться, поправьте если что). Но в любом случае, как вы сами и указали, все многопоточность сведется к одной последовательной операции чтения с диска. Но тут на помощь нам идет сам SQL, который возможно заранее все уже выгрузил в память.

P.S. Очень интересно было бы увидеть данные по приросту скорости выполнения при использовании приведенного метода многопоточности на реальной базе 🙂

(8) rphost выполняется не на одном ядре, он как раз может утилизировать все ядра. То, что это так можно убедиться запустив сервер 1с с одним процессом и увидев, что нагрузка попадает на все ядра. Из-за убеждения, что один процесс использует только одно ядро многие рекомендуют запускать рабочих процессов по числу ядер. На курсе 1с:Эксперт про это как раз рассказывают.

Многопоточность можно применять по-разному, кто мешает к примеру запустить несколько потоков с разными функциями, которые к примеру получают разные данные из базы. На выходе, получим почти одновременно выполненные запросы и таблицы с ответами.

Пришлось как-то изучить Java. Только самые азы. Так вот там все построено на многопоточности.

А если взять в расчет файловую базу, то там как многопоточность организовывать? Через обработчик ожидания? Серверными все, конечно, понятно, а вот как обстоит дело с файловыми? Кто-нибудь пробовал?

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

(19) spezc, обоснуйте свою позицию. У нас в организации многопоточность применяется от пакетного формирования печатных форм механизма автоматической печати и до обмена данными. Везде это приводит к весьма существенному улучшению производительности. Например, формирование печатных форм вместо трех часов занимает 50 минут (при пяти потоках).

(24) rtnm, да что Ви говорите ))) Не стоит писать то, в чем Ви не понимаете )))

(27) вообще, речь о том, что код управляющей процедуры зря тратит процессорное время, гоняя свой цикл без устали.

Если управляющая функция находится на клиенте, то стоит присмотреться к ПодключитьОбработчикОжидания, а если на сервере (это ваш случай), то к ФоновыеЗадания.ОжидатьЗавершения с выставленным таймаутом

(28) rtnm, ну минусы-то Вы сильны ставить, а вот разобраться с проблемой не хотите, получается. Вот Вам ссылка:

// Старый добрый WaitForMultipleObjects() в исполнении 1С вышел не айс. //

(29) минус вам за ваш слог в комментариях. Если бы вы в статье написали, что ФоновыеЗадания.ОжидатьЗавершения (с указанным таймаутом) работает как-то не очень, то моих комментариев вы бы и не увидели. По существу, вы проверяли что ФоновыеЗадания.ОжидатьЗавершения (с указанным таймаутом) сейчас работает как-то не очень?

(30) rtnm, во-первых, какое задание мы ожидаем? Все? Если все, то может так оказаться, что одно из заданий будет работать в 2 раза дольше, чем остальные. В итоге мы теряем вычислительные ресурсы сервера. И в 8.2. действительно до сих пор наблюдаются проблемы с работой ожидания завершения.

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

Любая программа может быть написана при помощи:

команд выхода из цикла;

операторов ветвления (if-then);

последовательностью команд, исполняемых одна после другой;

Примечание: обратите внимание, что универсальный оператор GOTO (безусловный переход) не нужен, а достаточно специального оператора выхода из цикла, при этом, в случае n вложенных циклов потребуется n специальных операторов выхода из цикла (кроме небольшого количества языков с расширенным синтаксисом операторов выхода) или один оператор GOTO и одна метка.

Спасибо огромное, теперь то я все понял.

мне надо многопотоковость для загрузки данных из удаленныхточек

(35) engineer74, а в чем проблема?

(37) engineer74, ну тут множество разных способов. Но важно выяснить, почему зависает задание. Причин тоже множество:

Существует несколько концепций: синхронное/асинхронное программирование и однопоточные/многопоточные приложения. Причём первая программная модель может работать в однопоточной или многопоточной среде. То есть приложение может быть: синхронным однопоточным, синхронным многопоточным и асинхронным многопоточным.

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

Синхронная модель

Потоку назначается одна задача, и начинается её выполнение. Заняться следующей задачей можно только тогда, когда завершится выполнение первой. Эта модель не предполагает приостановку одной задачи, чтобы выполнить другую.

Однопоточность

Система в одном потоке работает со всеми задачами, выполняя их поочерёдно.


Однопоточная синхронная система

Многопоточность

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

Иллюстрация: Программные модели

Многопоточная синхронная система

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

Белкасофт , Санкт-Петербург, можно удалённо , От 120 000 до 190 000 ₽

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

Асинхронность

Характеристики асинхронного кода:

  • обрабатывает больше запросов сервера, предоставляя потокам возможность обрабатывать больше запросов во время ожидания результата от запросов ввода-вывода;
  • делает пользовательский интерфейс быстрым, выделяя потоки для обработки действий в пользовательском интерфейсе во время ожидания запросов ввода-вывода, передавая затратные по времени операции другим ядрам ЦП.

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


Многопоточная асинхронная система

Конструкция async/await

  • async — используется в заголовке метода;
  • await — вызывающий метод содержит одно или несколько таких выражений.

Они используются вместе для создания асинхронного метода. У асинхронных методов могут быть следующие типы возвращаемых значений:

Пример асинхронного метода:


Результат асинхронного вычисления факториала

Этот пример приведён лишь для наглядности, особого смысла делать логику вычисления факториала асинхронной нет. Опять же, для имитации долгой работы мы использовали задержку на 8 секунд с помощью методы Thread.Sleep(). Цель была показать: асинхронная задача, которая может выполняться долгое время, не блокирует основной поток — в этом случае метод Main(), и мы можем вводить и обрабатывать данные, продолжая работу с ним.

Параллелизм

Эта программная модель подразумевает, что задача разбивается на несколько независимых подзадач, которые можно выполнить параллельно, а затем объединить результаты. Примером такой задачи может быть Parallel LINQ:

Иллюстрация: Программные модели

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

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

Какую программную модель выбрать?

Перечисленные программные модели должны применяться в зависимости от задач. Их можно использовать как отдельно во всём приложении, так и сочетать между собой. Главное, чтобы приложение было максимально эффективным и удовлетворяло требования пользователя.

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

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

Читайте также: