1с однопоточная программа или нет
Предположим, что программа 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С. Ограничением при работе нескольких (>10) пользователей уже будет выступать не сеть, тут 1 Гбит ещё хватит, а блокировки при многопользовательской работе.
- Платформа 1C 8.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:
Еще один пример — вычисление среднего значения двумерного массива, когда каждый отдельный поток может подсчитать сумму своей строки, а потом объединить результат и вычислить среднее.
Однако не стоит забывать, что не все задачи поддаются распараллеливанию. Например, описанная выше задача по вычислению факториала, в которой на каждом последующем этапе нужен результат предыдущего.
Какую программную модель выбрать?
Перечисленные программные модели должны применяться в зависимости от задач. Их можно использовать как отдельно во всём приложении, так и сочетать между собой. Главное, чтобы приложение было максимально эффективным и удовлетворяло требования пользователя.
Если речь идет о сложных многопользовательских приложениях, то стремиться стоит к использованию асинхронной модели, так как важна интерактивность и отзывчивость интерфейса. Взаимодействие с пользователем в активном режиме всегда должно быть максимально эффективным, даже если в фоновом режиме в то же время выполняются другие задачи. Издержки асинхронности, например, на переключение исполняемого контекста, в таком случае нивелируются за счет общей эффективности приложения.
В разработке простых приложений, к примеру, парсера документа, необходимости в асинхронности, или даже многопоточности, может и не быть.
Читайте также: