Менеджер потоков: реализация "любой" задачи в потоках

Публикация № 1102042 01.08.19

База данных - HighLoad оптимизация

Менеджер потоков – один их новых инструментов, который упрощает работу разработчиков. Насколько легко с ним, на конференции Infostart Event 2018 Education показал начальник отдела автоматизации 1С Иван Филимонов компании «Трансстроймеханизация».

Немного о себе

Я работаю в крупной строительной организации «Трансстроймеханизация». Наша организация является крупным строительным холдингом, занимается строительством дорог общественного пользования, взлетно-посадочных полос. Нашу технику можно было видеть в Шереметьево, в сочинских аэропортах.

 

О чем будет доклад

Тема доклада – “Менеджер потоков”, инструмент, позволяющий вести разработку алгоритмов, которые будут работать параллельно. При этом “Менеджер потоков” возьмет на себя максимум трудностей, с которыми может столкнуться разработчик при работе с потоками.

Кто далек от этой темы, кратко расскажу:

  • что такое “потоки”;
  • какие бывают способы распараллеливания;
  • чем является “Менеджер потоков”;
  • какие методы он позволяет использовать при распараллеливании;
  • архитектура “Менеджера потоков” при обмене данными;
  • общие принципы его работы;
  • “События” и “ресурсы”.

Для тех, кто захочет попробовать “Менеджер потоков” в деле, будет показано, как реализовать самые простые примеры.

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

 

Результаты тестов по восстановлению последовательности партий

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

На чем проводились тесты? Тесты проводились на платформе 8.3.10, режим совместимости 8.2.13, read committed snapshot у нас отсутствует. Мы еще не переехали на вариант без режима совместимости. База данных – “Управление производственным предприятием”. Размер базы 280 гигабайт, 1 юридическое лицо.

 

 

 

Тесты проводились на реальной базе, по четырем месяцам, размеры базы по количеству документов не очень большие – всего 20 тысяч документов месяц. Стандартное время обработки данного объема данных у нас занимает примерно 3,5 часа. Притом доступ у нас монопольный. Ни один из пользователей не может провести никакой документ, связанный с партиями, иначе у нас партии могут не восстановиться.

Запускался “Менеджер потоков” на 10 потоках.

Результаты получились у нас следующие: “Восстановление партий” у нас, стало происходить за 15,5 минут - ускорение в 14,5 раз и самое главное без монопольного доступа.

Вопрос в студию: ни у кого вопросов не возникает по данным результатам?

Возникает?

Я думаю, это вопрос “Как получились такие результаты”?

 

 

 

С чем связан этот вопрос? Связан он с тем, что в стандартном механизме “Восстановления партии” есть одна очень ресурсоемкая процедура, которая называется «СдвинутьПоследовательностьВперед». Именно она занимает львиную долю времени. Если ее убрать (при восстановлении в потоках, мы ей не пользуемся), то стандартное время восстановление будет проходить, в нашем случае, за 1,5 часа. Тогда восстановление в потоках у нас будет уже не 14-кратное, а 6-кратное. Это уже более-менее логично.

В нашем докладе будут принимать участие:

 

  •  сеанс «Основной программы» – этакий босс, ставит задачу, ждет результатов;

 

  •  сеанс «Менеджера потоков» – строгий дядька, контролирует все, следит за тем, чтобы вся работа шла;

 

  •  сеансы “Потоков” – ребята-работяги, им сказали копать отсюда и до обеда, вопросов не задают - работают.

 

Это наши герои.

Помимо этого, у нас еще будет супер-герой – господин “Зануда” . Он будет присутствовать на ряде слайдов. Где он будет присутствовать, слайд будет достаточно важным с точки зрения понимания архитектуры или внутренних тонкостей.

Еще, как во многих фильмах, у нас будет с Вами массовка. Чтобы было не очень скучно.

 

 

 

Что такое потоки

Кратко для тех, кто далек и не знает что такое “потоки”. Это запуск каких-то инструкций или процедур в нескольких узлах, на которые мы подаем определенные данные и ускоряем работу за счет того, что большой массив бьем на маленькие кусочки.

Основная цель очень простая – ускорение работы и утилизация свободных ресурсов сервера.

 

Способы распараллеливания

По классификации Флинна способов распараллеливания 4. Они описывают работу процессоров, но для лучшего понимания в принципе тоже подойдут.

  • Первый способ самый простой – полное отсутствие распараллеливания;
  • Второй способ – дублирование расчетов. Данный способ используется на критически важных объектах, где стоимость ошибки очень высока. Например, я точно знаю, что при запуске в СССР корабля “Буран” расчетом телеметрии и определенных параметров занимались несколько модулей сразу – по-моему, три. Если какой-то давал результат, который не совпадал с двумя другими, его данные просто-напросто отбраковывались.
  • Следующий вариант, он очень многим знаком, это как раз, когда массив данных бьется на маленькие кусочки, которые посылается в разные узлы и над ними выполняется какая-то инструкция.
  • Последний вариант – это то, как работают нынешние многопроцессорные системы, многоядерные процессоры. Когда у Вас, в один момент времени, над объемом данных работают разные инструкции. Один из методов, реализованных в “Менеджере потоков”, позволяет использовать такой подход.

 

 

 

Что же такое менеджер потоков?

С точки зрения метаданных это один общий модуль. Больше ничего нет. Вообще. Как хотите, так и используйте его. Хотите – в расширение заталкиваете, хотите – в метаданные засовываете.

Пока это идет как обычная *.cf, просто обновляете конфигурацию.

 

 

 

Но этого будет мало. Помимо этого, Вам, как разработчикам, потребуются “модули событий разработчика”. Что это такое, расскажу дальше. Сейчас я только лишь расскажу, где Вы можете их разместить.

 

  • Первый вариант – самый простой и самый лучший, как я считаю, – это под каждую процедуру многопоточной обработки делать отдельный “Общий модуль”. Таким образом Вы, по крайней мере, как-то локализуете свой пакет событий. Это просто упрощает дальнейшую навигацию, поиск каких-то корректировок, ошибок, доработки своих алгоритмов.
  • Следующий вариант – разместить алгоритмы в “Модуле объекта” внешней обработки. Когда может потребоваться? Например, у заказчика уже установлен “Менеджер потоков” конфигурации, а Вы хотите произвести какую-то обработку, которая будет многопоточно обрабатывать данные. Вы полностью весь код можете разместить в этой обработке, абсолютно не внося код в конфигурацию поставщика. И все будет работать.
  • И последний вариант, в принципе, я его не рекомендую использовать, но он, как пережиток прошлого, остался. Это размещение событий разработчиков в самом “модуле менеджера потоков”. Не рекомендую по той простой причине, что если будут выходить обновления, придется заниматься сравнением и объединением, как со всеми конфигурациями.

Поэтому пользуйтесь отдельными общими модулями под каждую задачу.

Если с другой стороны посмотреть. Можно провести аналогию с 1С. В 1С, мы знаем, есть инструмент – платформа (конфигуратор) и есть решения, которые мы получаем с помощью этого инструмента. Есть другой инструмент, например, “Конвертация данных”. эту конфигурацию многие знают, умеют пользоваться. И  есть решения, которые мы можем с помощью этого  инструмента получить. “Менеджер потоков” также является инструментом, а “модули событий разработчика” являются вашими решениями, которые Вы можете разрабатывать и использовать в своей работе.

 

 

 

Реализованные методы

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

У нас есть большой массив данных, который мы бьем на много-много маленьких кусочков. Каждый кусочек посылаем свое фоновое задание, где его как-то обрабатываем. В принципе все - никаких проблем. Но бывают иногда случаи, когда нужно данные вернуть обратно. Тут уже возникают некоторые сложности. Сложности, например, могут возникнуть с таким понятием, как “склейка”. Потому что данные, например, надо склеить в той же самой последовательности, в какой они были до того как отправились в потоки. Еще появляется  вопрос, как вернуть данные из фоновых заданий обратно клиенту? Обычно тут используется “Временное хранилище”.

Но сложностей будет гораздо больше. Эти все проблемы на себя берет “Менеджер потоков”. Вам больше не надо будет ломать голову, как решить ту или иную задачу.

 

 

 

Методы, которые реализованы в “Менеджере потоков”.

На данный момент их насчитывается 3.

  • Первый – самый простой – «ДополнитьКоллекцию». Допустим, у Вас есть коллекция либо “Массив”, “СписокЗначений”, “ТаблицаЗначений”. Вы эту коллекцию посылаете в “Менеджер потоков”, на выходе получаете копию этой коллекции, но уже измененную, на сколько измененную, Вы опишете в событиях разработчика.

 

 

 

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

 

 

 

 

  • Третий вариант, наверное, самый сложный, но и самый интересный. Из этой задачи и родился “Менеджер потоков”, как отдельная разработка. Данный метод позволяет “Менеджеру потоков” строить граф зависимости объектов в своей памяти и посылать объекты на обработку уже не в порядке следования в той коллекции, которую Вы берете для обработки, а по определенным механизмам связывания объектов. Как объекты будут связаны между собой, также определяете Вы в “событиях разработчика”.

Данный вариант Вам подойдет, например, в процедуре “восстановления партии”, процедуре “восстановления взаиморасчетов контрагентов”. Может быть, есть какие-то “цепочки формирования производственных документов”, где документы должны идти в строгой последовательности. Как вариант еще может быть обработка каких-то объектов, которые друг друга блокируют по пересечению измерения регистров. Чисто теоретически тоже можно воспользоваться “Менеджером потоков” и обработать массив объектов в потоках без блокировок.

 

 

 

 

Архитектура  

Как организована вся архитектура внутри менеджера потоков?

У нас есть “Основная программа”, есть “Фоновое задание менеджера потоков”, есть запущенные “Потоки”. Весь обмен данных между ними происходит с помощью “Хранилища общих настроек”. Замечательный объект в 1С, который позволяет хранить произвольный тип данных. То есть мы уходим от “Временного хранилища”, мы уходим от файловой передачи данных. Замечательный объект, который позволяет эти все вопросы решить. В рамках данного хранилища реализуется следующее:

  • Пул данных “ячеек потоков”, который равен количеству запущенных потоков, для каждого потока своя отдельная ячейка, за которой он следит.
  • Пул данных “клиент-поток”. Это те ячейки, куда подаются данные для обработки потоками. Их количество несколько другое и зависит от определенного коэффициента. На значение данного коэффициента Вы, как разработчик, также можете влиять. По умолчанию я его поставил равным 3. Данный коэффициент имеет очень высокое значение, он может позволить как увеличить распараллеливание и ускорить обработку данных, так и уменьшить ее, т.к. при большом значении этого коэффициента “Менеджер потоков” может заниматься больше обсчетом графа, нежели “Потоки” будут выполнять работу непосредственно с самими данными. Количество этих ячеек определяет размер графа, с которым одновременно работает “Менеджер потоков”. Те данные, которые не успевают попадать в граф, копятся в отдельные очереди.
  • Еще один пул ячеек – их всего 2е – для того, чтобы менеджер потоков и основная программа как-то тоже обменивались данными.

 

 

Как в общем происходит самая работа?

  1. “Основная программа” подает данные на обработку в свободные ячейки (пул “клиент-поток”).
  2. Для “Менеджера потоков” сообщает адреса, в которых находятся данные, которые мы посылаем на обработку.
  3. Менеджер потоков крутится в цикле (других вариантов придумать не получилось), мониторит свою ячейку обмена с “Основной программой”, смотрит, появились там данные или нет. Если данные появились, “Менеджер потоков” их забирает.
  4. По полученным адресам “Менеджер потоков”, забирает данные из пула “Клиент-Поток”. После этого он строит независимый граф, определяет, какие потоки свободны.
  5. В свободные потоки перенаправляет адреса ячеек, где хранятся данные.
  6. “Поток” также крутится в цикле, следит за своей одной ячейкой. Как только “поток” видит, что данные в ней появились, он их считывает.
  7. По полученному адресу “поток” забирает данные из пула “клиент-поток” и как-то их обрабатывает.
  8. После того как данные будут обработаны, “ответ” от “потока” складывается в ту же самую ячейку, откуда были данные взяты (пул “клиент-поток”).
  9. Ячейка, за которой “поток” следит - очищается.
  10. “Менеджер потоков” знает, какие “потоки” у него сейчас работают, следит за теми ячейками, с которыми “потоки” работают. Как только он видит, что ячейка освободилась, “Менеджер потоков” понимает, что “поток” закончил свою работу
  11. “Менеджер потоков” забирает данные для анализа. На этом этапе “Менеджер потоков” принимает решение, что делать дальше. Вариантов может быть три:
  • Первый вариант – “Пропуск” – мы сообщаем “Основной программе”, что объект не требует никакой дальнейшей обработки. Если смотреть с точки зрения “Восстановления последовательности партии”, это у нас может быть обработка документа “Поступление товаров и услуг”.
  • Второй вариант - потоки “Рассчитали ресурсы” (об этом будет сказано дальше). “Менеджер потоков” забирает данные по этому объекту к себе, строит граф, уже зависимый. Устанавливает связи по рассчитанным ресурсам этого объекта с другими объектами, которые стоят в обработке, и при наступлении определенного момента посылает этот объект дальше на обработку в “потоки”.
  • Третий вариант - “поток” вернул “Ответ”, то есть полностью закончил обработку объекта
  1. “Менеджер потоков” консолидирует информацию на данной итерации и  сообщает “Основной программе”, список адресов с результатами.
  2. “Основная программа”, пока работает “Менеджер потоков”, также крутится в цикле. Она смотрит за своей ячейкой, где ей будут приходить результаты. Увидев, что там появились какие-то данные, она их забирает
  3. По полученным адресам “Основная программа” забирает результаты из пула “клиент-поток”.

 

 

 

Общая схема в принципе выглядит примерно так:

 

 

 

 

Общие принципы работы

Тут на самом деле все очень просто.

Инициализация. Что у нас есть? У нас есть “Основная программа”. В ее рамках

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

 

 

Поддержка работоспособности. У нас есть “Менеджер потоков”, есть “Фоновые задания потоков”. “Менеджер потоков” раздает данные “Потокам” и бдительно за ними следит, чтобы “Потоки” работали корректно.

Но не все бывает так гладко - “потоки” могут падать. “Менеджер потоков” знает, что такая проблема бывает, он “поднимает поток”. Но “поток” может снова упасть. “Менеджер потоков” знает, что эта процедура бывает непростая. Он это все дело пытается повторить несколько раз. Сколько раз, определяется с помощью определенного параметра – “ПределКоличестваПопытокОбработатьОбъект”. По умолчанию этот параметр равен 5 (в последней версии сокращен до 1). То есть 5 раз “Менеджер потоков” пытается обработать один и тот же объект. Но может быть ситуация, что объект просто нельзя обработать, потому что какой-то реквизит не задан и объект, например, не проводится и не записывается. По достижении данного порога “Менеджер потоков” все-таки возобновляет работу “потока”, но данные в него уже не передает, а “Основной программе” он сообщает, что обработать данный объект не удалось.

 

 

Завершение работы. Как было сказано, у нас “Менеджер потоков” бдительно следит за работой “потоков”. Но при этом “потоки” – это тоже ребята не простые, они тоже присматривают за менеджером. Если по каким-то причинам “Менеджер потоков” выходит из строя, а причины могут быть разные. “Потоки” говорят, что им тоже жизнь не мила без их менеджера.

Если “Менеджер потоков” прекратил свою работу на этапе обработки данных, предположим, вскрылась какая-то критическая ошибка, “Основная программа” выдаст ошибку. Если же “Менеджер потоков” прекратил свою деятельность по той простой причине, что он просто все обработал и больше обрабатывать ничего, “Основная программа” продолжает дальнейшую работу.

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

 

 

 

События

Что такое события?

“События” – это, можно так сказать, “окошки” в алгоритмах менеджера потока, с помощью которых разработчик может существенно влиять на работу “Менеджера потоков”. По большому счёту, это эквивалент подписок на события. Они даже примерно так и называются. Количество событий на сегодняшний момент 15. Между нашими героями они распределены примерно в таком варианте:

 

 

 

 

Можно заметить, что некоторые события являются процедурами, некоторые – функциями. События, являющиеся функциями, позволяют свой результат передавать в другие события, притом даже между участниками. Если, например, в событии “ПриЗапускеМенеджераПотоков” выполнить какие-то действия, собрать какой-то пул данных, то его можно получить на стороне каждого потока, при этом не рассчитывая каждый раз.

 

Работа менеджера потоков в разных сеансах.

Сеанс основной программы. У нас есть модуль “Основной программы”, есть модуль “Менеджера потоков”. В рамках “Основной программы” надо произвести инициализацию, где указать место расположения событий разработчика “менеджера потоков” как имя модуля и имя функции. В этот момент подключается библиотека с событиями разработчика. Она достаточно простая – одна функция, где через оператор “Если” мы перебираем все события, которые у нас могут быть и в зависимости от события, мы выполняем те или иные действия.

Дальше производим инициализацию “Менеджера потоков”. Срабатывает самое первое событие “ПередЗапускомМенеджераПотоков”, где вызывается функция, куда передается по умолчанию два параметра, но параметров может быть 3 (максимум) в зависимости от событий. После этого происходит запуск “Менеджера потоков”. Затем происходит запуск основного цикла обработки коллекции, где мы передаем объекты. В рамках данного цикла происходит:

  • получение данных из “Менеджера потоков” и обработка следующих событий
    • ПриОбработкеОшибки;
    • ПриОбработкеОтвета;
    • ПриОбработкеПропуска.
  • Потом происходит отправка новых данные в “Менеджер потоков”

После обхода основного цикла выполняется метод «ДождатьсяОстановкиМенеджераПотоков», в рамках которого накопленная очередь продолжает обрабатываться, потому что не все может происходить в один момент времени, она обрабатывается по тому же самому алгоритму, как и основная обработка всех объектов.

В конце вызывается завершение метода “Менеджера потоков” и еще 2 события:

  • первое связано с мониторингом;
  • второе - “ПослеЗавершенияМенеджераПотоков” - последнее событие, в котором Вы можете что-то еще дополнительно сделать.

 

 

 

 

В рамках “Менеджера потоков” все чуть проще.

У нас срабатывает первое событие при начале менеджера потоков “ПриЗапускеМенеджераПотоков”, как и в основном сеансе программы. Затем запускается цикл запуска “потоков”, перед запуском каждого потока, можно обработать еще одно события “ПередЗапускомПотока”, затем выполняется запуск самого потока.

После этого идет основной цикл программы, в рамках которого мы проверяем:

  • состояние потоков;
  • проверяем данные, которые у нас были обработаны;
  • отправляем данные “Основной программе”;
  • получаем новые данные от “Основной программы”;
  • отправляем данные в “потоки”.

В конце снова два события:

  • “ПередЗавершениемМенеджераПотоков”
  • и еще одно событие, связанное с мониторингом.

 

 

У “потока” все еще проще. Также у нас первое событие “ПриЗапускеПотока”. Основной цикл здесь очень простой:

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

 

 

 

 

Примеры

Самые простые примеры, необходимый минимум, что необходимо сделать для того, чтобы что-то заработало.

Метод “ДополнитьКоллекцию” очень простой. Что нам надо? На стороне основной программы пишем две строчки:

  • получаем структуру параметров инициализации “Менеджера потоков”, куда передаем идентификатор менеджера и место расположения событий разработчика.
  • После этого вызываем метод «ДополнитьКоллекцию», куда передаем структуру параметров и коллекцию.

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

На стороне менеджера Вам нужно обработать всего одно событие “ПриОбработкеДействияПотока”. Код будет выглядеть примерно так:

 

 

 

Это Ваш модулей событий разработчика, маленькая заготовка, где показан код, как можно достучаться до элемента коллекции. Дальше с этим элементом делаете всевозможные манипуляции – меняете, делаете поиск данных, подставляете какие-то значения, все, что хотите. И в конце в переменную “НоваяКоллекция” у Вас вернется уже обновленная коллекция, обработанная в потоках.

Метод “ОбработатьКоллекцию” очень похож на предыдущий. Здесь все

очень просто, все то же самое. Единственное – меняется сам метод, который Вы используете. Но событий надо обработать уже два:

  • первое событие точно такое же как “ПриОбработкеДействийПотока”
  • второе – “ПриОбработкеМассиваОбработанныхФрагментовКоллекции”.

Здесь код примерно такой же.

Но здесь немножко меняется концепция: в события “ПриОбработкеДействияПотока” уже дается не элемент коллекции, а фрагмент коллекции, с которым Вы производите какие-то манипуляции.

И в событии “ПриОбработкеМассиваОбработанныхФрагментовКоллекции” мы получаем уже отсортированный в нужном порядке массив фрагментов, который посылался на обработку в потоке, объявляется новая коллекция, которую Вы хотите получить на выходе, ее каким-то образом компонуете (как внешние таблицы СКД, как табличный документ и т.д.).

 

 

 

Про метод «ОбработатьОбъект» пока рано говорить. Надо сначала обсудить ситуацию с “Ресурсами”.

 

Ресурсы

“Ресурс” – это то, что позволяет “Менеджеру потоков” построить граф. Графы – это у нас кружочки, их ещё называют узлами. И есть еще стрелочки, их ещё называют ребрами или дугами. Больше нам ничего не требуется для того, чтобы построить графы. Если смотреть с точки зрения теории графов, то там есть еще очень большое количество понятий и определений, но разработчику они будут не нужны. Все, что нужно разработчику, – это понимать, как строятся сами связи.

Связи строятся очень просто: они строятся на основании ресурсов. У нового объекта, добавляемого в граф, рассчитываются ресурсы и если какие-то из этих ресурсов совпадают с ресурсами других объектов уже находящихся в этом графе, то между ними устанавливается связь. Притом связь в одном направлении: от более позднего к более раннему. Если, предположим, объектов с одним и тем же ресурсов в графе будет найдено несколько, тогда связь устанавливается до самого позднего среди ранних. Те объекты, которые не ссылаются на какой-либо другой объект, то есть ни от какого другого объекта не зависят, посылаются в “потоки”.

 

 

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

 

 

 

Ниже приведены простые примеры, как это делается на примере “Восстановления партий”.

 

 

 

Наверху у нас последовательность документов, реализации и перемещения. Каждый цвет это отдельный склад. Разработчик определяет состав ресурсов (как он выглядит графически, смотрите на слайде). На основании этих ресурсов “Менеджер потоков” строит граф. И объекты по такому графу посылаются в обработку в потоки.

Если немного усложнить, то мы делаем с Вами обработку объектов не только по складам, но и по составу документа, то есть у нас будет склад и материал.

 

 

 

С точки зрения обычной обработки у нас ничего не меняется. Как был поток, так он идет. Если мы с Вами рассчитаем ресурсы, то менеджер потоков на основании таких ресурсов построит другой граф. И объекты он пошлет уже по-другому количеству потоков.

Слайд для сравнения

 

 

Можно увидеть, что в зависимости того как Вы будете строить ресурсы, будут получены и разные графы. И от этих графов будет получен разный результат работы объектов. То есть в принципе все зависит от Вас, как от разработчиков.

 

Механизм формирования ресурсов

 

 

По большому счету здесь рассчитывается хэш ресурсов. Притом состав ресурса может быть совершенно разным, не обязательно у нас состав ресурса должен быть однотипный. Обратите внимание на левой табличке, где формируется массив ресурсов, внизу лежит ещё “заказ”. То есть мы можем формировать разными способами связывание объектов.

Следующий слайд показывает особенности формирования. В рамках нашего варианта “восстановления партии” правильный будет только один, но в принципе другие тоже могут быть – в зависимости от ваших задач.

 

 

Остался метод «ОбработатьОбъект».  Здесь немножко и структура меняется, нужно также получить параметры, проинициализировать “Менеджер потоков”, запустить обработку коллекции, куда мы передаем:

  • параметры менеджера;
  • элемент для обработки;
  • дополнительную произвольную структуру с параметрами необходимыми для обработки конкретного элемента.

 На стороне менеджера потоков нам надо обработать три события: “ПриПолученииРесурса”, “ПриОбработкеДействияПотока” и “ПриДобавленииВОчередьПотока”. Весь код на слайде.

 

 

 

 

 

Мониторинг

Здесь все просто. Тут буквально несколько слайдов, что еще можно сделать.

 

 

 

 

 

 

Спасибо за внимание.

 

Менеджер потоков: //infostart.ru/public/778905/

 

****************

Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2018 EDUCATION.

Больше статей можно прочитать здесь.


 

*************

Скачать файлы

Наименование Файл Версия Размер
Презентация

.pptx 4,03Mb
26
.pptx 4,03Mb 26 Скачать бесплатно

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Идальго 217 01.08.19 14:47 Сейчас в теме
Менеджер потоков это в 1с теперь новый объект-механизм такой или вот что-то типа обработки, которая разделяет данные и выполняет в фоновых заданиях. Я просто далёк сейчас от 1С и не в курсе тенденций и того, что 1с добавляет в платформу.
2. DarkAn 1049 01.08.19 15:48 Сейчас в теме
(1)
Менеджер потоков это в 1с теперь новый объект-механизм такой или вот что-то типа обработки

Это "общий модуль" для работы с фоновыми заданиями для Ваших обработок.
cleaner_it; +1 Ответить
3. Dorosh 172 02.08.19 12:03 Сейчас в теме
Спасибо за интересный материал. Не нашел в статье ничего про настройку сервера СУБД. Какую СУБД использовали, сколько рабочих процессов делали, сколько соединений на процесс? Пробовали на отдельном сервере или кластере?
4. DarkAn 1049 02.08.19 13:31 Сейчас в теме
(3) Это не играет роли для использования. Но играет для результата.

Все детали по железу изложены в стать к первой версии (https://infostart.ru/public/626117/), там есть раздел "Железо". Хотя про настройку СУБД там ни слова, но все сделано по рекомендациям курса "Оптимизация производительности" от "курсы по 1С"
5. Alien_job 183 02.08.19 14:12 Сейчас в теме
Двигающиеся слайды невозможно читать
Дмитрий74Чел; +1 Ответить
6. DarkAn 1049 02.08.19 15:17 Сейчас в теме
(5)
Двигающиеся слайды невозможно читать

Верю :)
Выложил презентацию для скачивания :)
7. Skif1989 11.02.21 21:36 Сейчас в теме
Например, это поможет решить вопрос...с медленным закрытия месяца на бухгалтерии?
У нас до 30 тыс документов бывает за месяц.
сервер sql
xeon 312 3.6 4 проца
73 gb
1с сервер
xeon 312 3.6 8 проца
43 gb

я уже полгода смотрю из-за чего такие тормоза...понять не могу.
Оставьте свое сообщение

См. также

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    93336    227    95    

275

Простой способ проверки быстродействия

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

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

10.04.2023    2037    vkrivov@yandex.ru    14    

32

Пример многопоточной обработки (БСП)

Обработка документов HighLoad оптимизация Обработка справочников БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка-шаблон, на основе которой можно делать свои многопоточные обработки данных для конфигураций на БСП.

13.02.2023    6087    4    echo77    8    

76

Нагрузочное тестирование в 1С:ERP

HighLoad оптимизация Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

02.11.2022    4046    Tavalik    23    

34

MS SQL Server: ваши статистики не работают! Так ли все плохо на самом деле?

HighLoad оптимизация Бесплатно (free)

Состояние и качество статистик критически важны для эффективной работы системы. Но у заметной части типовых конфигураций статистики просто не могут работать эффективно. О том, почему так происходит и что с этим делать, на конференции Infostart Event 2021 Post-Apocalypse рассказал Александр Денисов.

27.09.2022    3337    Филин    11    

37

Утилита тестирования сервера 1С от HADGEHOGs

HighLoad оптимизация Мониторинг Платформа 1С v8.3 Россия Бесплатно (free)

Программа для тестирования вашей инфраструктуры 1С. Анализ ключевых параметров оборудования и ПО серверов 1С и MS SQL, поиск ошибок в базах 1С на стороне MS SQL, тестирование производительности серверов MS SQL и 1С, обмен результатами замеров с сообществом, построение отчета.

21.09.2022    13165    1020    Hadgehogs    56    

131

Быстрый фронт в базе размером 6.8 терабайт – наши стандарты при разработке и рефакторинге запросов

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

От быстродействия запросов, которые обращаются к крупным таблицам, напрямую зависит скорость работы всей базы в целом. Артем Кузнецов, тимлид команды 1С в компании ООО «Финтех решения» на конференции Infostart Event 2021 Moscow Premiere рассказал, как оптимизировать производительность при поддержке больших систем. Показал, на что следует обращать внимание при код-ревью запросов, как оптимизировать RLS, виртуальные таблицы, индексы и условия, и как доработка архитектуры решения может ускорить работу базы.

29.08.2022    6405    Chernazem    44    

109

Ускорим проведение в 1С:Управление холдингом

HighLoad оптимизация Запросы Платформа 1С v8.3 1С:Управление холдингом Бесплатно (free)

В 1С:Управление холдингом есть "нехороший" запрос, который съедает значительную часть времени проведения документов. Если его подправить, то проведение заметно ускорится.

10.08.2022    5341    sapervodichka    64    

74

Методика похудения для 1С – 100%

Свертка базы HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Удаление архивных данных из базы - это непростая задача как для 1С, так и для любой базы данных. В статье изложены различные способы решения задачи, включая самый эффективный для 1С.

28.07.2022    6036    1CUnlimited    39    

45

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье хотим рассказать об одном нашем непростом расследовании, в котором удалось собрать сразу несколько проблем на разных уровнях инфраструктуры заказчика и изначальной методологии ведения учета. Само расследование в какой-то момент стало напоминать детективную историю, с роялями в кустах, ошибками платформы, странным поведением пользователей и магическим поведением хорошо знакомых механизмов. Но мы реалисты, поэтому все проблемы были выявлены и устранены ;)

11.07.2022    5775    it-expertise    27    

57

10 «заповедей» эксплуатации крупной информационной системы 1С

Управление ИТ-подразделением Внедрение ИТ-системы HighLoad оптимизация Бесплатно (free)

Крупные системы 1С давно уже перешагнули и десятки терабайт, и тысячи пользователей, но во многих случаях подход к эксплуатации таких систем остаётся не на должном уровне. Антон Дорошкевич на конференции Infostart Event 2021 Post-Apocalypse поделился более чем 10-ти летним опытом эксплуатации подобных систем, сведя его к 10 «заповедям», соблюдение которых сделает 1С надёжнее, а труд разработчика – благодарнее и благороднее.

11.07.2022    7925    a.doroshkevich    33    

86

Решение проблем подвисания 1С “в онлайне”. Инструмент - консоль управления блокировками и процессами 1С и PostgreSQL (MS SQL - тестируется)

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 Управляемые формы 8.3.14 Конфигурации 1cv8 Абонемент ($m)

Обработка-консоль, улучшенная версия консоли администрирования 1С для решения проблем с производительностью, поиска и устранения блокировок и длительных запросов. Тестировалось на платформе 8.3.14, 8.3.17, 8.3.20 УФ.

1 стартмани

04.07.2022    7457    65    victor_goodwill    23    

38

Производительный режим работы RLS

HighLoad оптимизация Роли и права Платформа 1С v8.3 8.3.14 8.3.6 8.3.8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Бесплатно (free)

Функционал подсистемы УправлениеДоступом позволяет работать с RLS в двух режимах: стандартном и производительном. Каждый из режимов имеет свои преимущества и недостатки относительно другого. Основные из них будут рассмотрены в данном материале.

14.06.2022    9289    Neti    7    

96

Любовь. Быстродействие. 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

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

26.05.2022    4222    vasilev2015    20    

34

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

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 8.3.14 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

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

24.05.2022    4302    avolsed    15    

33

Несколько слов про платформенный механизм оптимизации RLS

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Смотрим, как работает платформенный механизм оптимизации RLS, сравним поведение на разных СУБД MS SQL, Postgres 11,13,14.

07.04.2022    3874    ivanov660    23    

69

Экспертный кейс. Расследование фатального замедления времени расчета себестоимости в 1С:ERP 2

HighLoad оптимизация Механизмы типовых конфигураций Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

При выполнении нагрузочного тестирования информационной системы на базе 1С:ERP для одного из клиентов с целью оценки возможности миграции системы на PostgreSQL и Astra Linux мы столкнулись с неприемлемым увеличением времени выполнения расчета себестоимости. Строго говоря, сценарий тестирования закрытия месяца не был выполнен вообще – он не укладывался в таймаут выполнения теста, 24 часа. По прошествии 18 часов всё ещё шло выполнение операции «Распределение затрат и расчет себестоимости». Более 16 часов выполнялся подэтап “Расчет партий и себестоимости. Этап. Расчет себестоимости: РассчитатьСтоимость”. Всё это время выполнялся запрос, который в текущей инфраструктуре клиента (СУБД MS SQL Server) выполняется чуть более 3 минут на аналогичных данных.

25.03.2022    5900    it-expertise    92    

68

Пример пошагового решения проблемы производительности на базе Postgres SQL с картинками

HighLoad оптимизация Технологический журнал Платформа 1С v8.3 Бесплатно (free)

Рассмотрим по шагам процесс обнаружения, анализа и решения проблемы производительности на примере базы ERP, сравним отличия в работе Postgres и MS SQL.

28.02.2022    13612    ivanov660    18    

147

Привилегированные отчеты

Роли и права HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширение позволяет настроить для пользователей выполнение отчетов в привилегированном режиме. 1) Убирает тормоза формирования отчета, возникающие при наложении прав пользователя на запросы отчета; 2) Позволяет обойти ошибки формирования отчета из-за отсутствия прав на часть объектов у пользователя.

4 стартмани

24.01.2022    11238    27    sapervodichka    36    

102

Ускорение работы конфигуратора 1С с большими прикладными решениями

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Ускорение работы 1С конфигуратора с большими прикладными решениями путем размещения системных каталогов 1С на RAM диске.

13.01.2022    7449    stg2005    105    

40

AMD RYZEN 5600X: погоня за попугаями

HighLoad оптимизация Бесплатно (free)

Все по-взрослому...

08.12.2021    8596    starik-2005    333    

39

Инструкция по получению плана запроса через Extended Events

HighLoad оптимизация Бесплатно (free)

Доброго времени суток, коллеги. Хочу рассказать, как можно посмотреть план запроса через механизм Extended Events. Я хочу ответить на вопрос - как разработчику через SQL Management Studio посмотреть, что запрос, который он сделал, работает оптимально. На Инфостарте есть несколько статей, которые посвящены трассировкам в этом механизме. Мне, когда я не понимал, как это правильно делать, не хватало простой пошаговой инструкции. Я напишу инструкцию, выполняя которую можно будет увидеть план запроса, который выполняется из базы данных.

22.11.2021    3078    Andrei_Ivanov    3    

46

Повышение производительности веб-сервисов. Переиспользование сеансов

WEB-интеграция HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Повышение производительности веб-сервисов. Переиспользование сеансов. Практическая реализация.

20.10.2021    4954    sorter1    3    

47

Изыскания на тему записи в регистр сведений

HighLoad оптимизация Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

21.09.2021    13943    0    METAL    57    

104

Адекватный параллелизм в 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Параллелизм ускоряет выполнение тяжелых регламентных операций на СУБД, но может негативно влиять на работу многопользовательских учетных систем. О том, как анализировать влияние параллелизма и настраивать его для MS SQL и PostgreSQL, рассказал ведущий разработчик компании ООО МКК «Ваш Инвестор» Вадим Фоминых.

13.08.2021    15470    Shmell    8    

59

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

HighLoad оптимизация Бесплатно (free)

В статье описан подход, позволяющий создавать счетчики производительности Windows для 1С:Предприятие.

09.08.2021    5071    blackhole321    8    

50

Распространенные ошибки разработчиков, приводящие к проблемам производительности

HighLoad оптимизация Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Рассмотрим примеры ошибок, анализ, исправление и мероприятия по недопущению подобного в будущем. Всего будет 18 примеров.

02.08.2021    16515    ivanov660    77    

142

Parameter sniffing и генерация планов для разработчиков 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Особенности генерации планов запросов. Статья написана по мотивам вебинара Виктора Богачева.

01.06.2021    15763    vasilev2015    17    

35

Поиск причин блокировок СУБД

HighLoad оптимизация Платформа 1С v8.3 Управление блокировками Конфигурации 1cv8 Бесплатно (free)

Расследование блокировок СУБД. Статья написана по мотивам вебинара Виктора Богачева.

28.04.2021    8494    vasilev2015    14    

84

Решение нестандартных проблем производительности на реальных примерах

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

На екатеринбургском Infostart Meetup выступил с докладом архитектор ИС центра разработки ФТО Александр Криулин. Он поделился с коллегами кейсами нестандартных проблем производительности и рассказал о способах их решения.

24.03.2021    8135    AlexKriulin    37    

78

Соединение вложенными циклами

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Nested loops и отсутствующие индексы. Статья написана по мотивам вебинара Виктора Богачева.

12.03.2021    5276    vasilev2015    22    

61

Анализ блокировок СУБД: таблица изменений плана обмена 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Практический пример анализа типичной проблемы ожидания на блокировках СУБД, возникающих при использовании планов обмена 1С. Сервер СУБД: Microsoft SQL Server.

18.12.2020    5935    zhichkin    11    

36

Контекст всегда важен. История проблем производительности

HighLoad оптимизация Бесплатно (free)

Небольшая история о проблемах производительности из-за нехватки процессорных мощностей. А также описание основных показателей работы CPU.

26.11.2020    10184    Infostart    21    

133