Решение проблемы быстродействия в ERP на рабочем примере

06.04.24

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Мониторинг производительности (Анализ технологического журнала) 2.0.9.11
.cf 1 023,49Kb ver:2.0.9.11
387
387 Скачать (3 SM) Купить за 2 450 руб.

Постановка задачи

Проблема: выполнение операции занимает значительное время под пользователями с ограничениями.

Задача: оптимизировать проблемный участок с минимальными переделками и доработками.

Исходные данные: ERP ~700 онлайн одновременно. Подсистема производство. Точка входа: кнопка «Диспетчирование (ББВ)» в подсистеме производство.

Диспетчирование (ББВ)

Пару слов про работу этой кнопки с технической стороны: По нажатию на эту кнопку на сервере запускается фоновое задание, результат которого ожидается на форме клиента. Фактически ЕРП не висит (выполняется асинхронно), но пользователь ждет результатов выполнения, чтобы приступить к работе.

Замечание: Мы же знаем, что время = деньги! А также что время ожидания еще коррелирует с точкой закипания пользователя ;)

Последовательность решения

Начальный этап.

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

Замечание: Согласитесь - плохой тон включать ТЖ на все и для всех.

I) Замер с таймером. 

А) Замер с таймером на рабочей базе.

Предварительный анализ показал, что под пользователем с полными правами выполняется в диапазоне от 5-15 сек. Под пользователем с ограничениями выполняется от 50-70 сек.

Б) Замер с таймером на локальной копии.

Под полными правами 3-8 сек. Под пользователем с ограничениями 4-10 сек.

Выводы: проявляется под нагрузкой.

II) Включаем замер технологического журнала (ТЖ).

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

<eq property="p:processName" value="ERP"/> 
<eq property="usr" value="Пользователь"/> 
<property name="sessionid" value="1234"/>

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

Б) Делаем замер на копии. Под полными и не полными.

Получаем фактически «квадрат» из таблиц, показывающих как ведет себя система под нагрузкой и без, при учете РЛС и без.

Для выполнения анализа воспользуемся конфигурацией «анализ технологического журнала» ссылки в конце статьи.

Замечание: Мы считаем, что анализ журнала должен быть простым и наглядным, а мериться длиной глубиной знаний в разборе текста на perl или regexp не стоит, можно заняться и более приятным делом, пока необходимый инструмент работает. К примеру, выпить чаю с печенькой)

Табл. 1 Замеры пользователя с ограничениями RLS на нагруженной базе

Табл. 2 Замеры пользователя администратора на нагруженной базе

III) Анализируем, выполняем поиск проблемных участков  

Берем и открываем расшифровку Context для длительной операции согласно рисунку "Табл.1" и смотрим его расшифровку:

 

Технически проблемная часть находится в модуле «ОперативныйУчетПроизводстваВызовСервера» -> функция «ДанныеДляФормированияМаршрутныхЛистов». 

Проблемной частью в нашем случае является выполнение запроса под RLS.  Архитектурные изменения не рассматриваем (минимум изменений), думаем как оптимизировать.

Запрос и представление функции выглядит так.

 

IV) Вырабатываем решение.

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

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

  • Накладываем фильтр простыми отборами соответствующими RLS. В качестве примера возьмем реализацию АРМ "Отгрузки" типовой конфигурации. На пользователя наложен RLS по складам на справочник Склады, т.е. он может выбрать только те склады к которым у него есть доступ. Поэтому накладывать ограничения на запросы позволяющие получить таблицу распоряжений не имеет смысла и можно получать результат в привилегированном режиме.
     
  • Накладываем фильтр набором разрешенных данных. Если в запросе с разрешенными можно выделить некоторую изначальную выборку данных, в рамках которой в дальнейшем определяется итоговый результат, то эти данные выберем сначала (используя разрешенные), а на последующий пакет запросов искусственно накладываем фильтр из этого набора (используем внутреннее соединение с временной таблицей, оператор "В"). Т.е. иногда можно разбить запрос с разрешенными на две части - под ограничениями и без (в привилегированном режиме). 

В данном случае было предложено использовать разбиение запроса и реализовать следующим образом:

1. добавить мини запрос, в котором выбрать разрешенные распоряжения по таблице с остатками (фильтр из данных)

2. оставшийся типовой запрос выполнить в привилегированном режиме, но с дополнительной фильтрацией по данным временной таблицы из первого запроса.

На что еще необходимо обратить внимание (Вы это скорее всего прекрасно знаете):

а). Выносить во временные таблицы стоит только фильтрованные данные. Плохим примером было бы вынести вместо таблицы остатков, таблицу документов, а потом ее отфильтровать.

б). Стараться всегда, где можно использовать фильтры и отборы.

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

г). Условия в виртуальных таблицах.

д). "Или" переделывать на объединения (вопрос к знатокам, приходилось ли разбивать на десятки объединений условия по ИЛИ)?

Код запроса и представление функции с изменениями:

 

Замеры после оптимизации показали следующие результаты: 
 - Время для полноправного пользователя стало в районе 3-10 сек ,
 - Пользователь с ограничениями стал работать в интервале 10-15 сек.

На рисунке ниже приведена таблица с замерами, выполненными после оптимизации (все замеры проводились при одинаковых настройках).

Табл. 3 Замеры пользователя с ограничениями RLS после оптимизации

Послесловие ... 

Проект для анализа технологического журнала расположен на GitHub по адресу: https://github.com/Polyplastic/1c-parsing-tech-log 

Скажу сразу - другие готовые инструменты для решения подобных проблем нам не подошли в связи с поставленными перед нами целями и задачами.

Замечание: Для тех, кто не хочет ставить EDT и компилировать, но хочет посмотреть – есть возможность скачать с infostart ссылка внизу.
В общем включайтесь в разработку на EDT и Open Source, и да прибудет с нами сила.

(Об особенностях процесса разработки на EDT я рассказывал тут: Взгляд на практику разработки в EDT из зазеркалья )


нагрузочное тестирование ERP оптимизация быстродействие Тестирование 3.0

См. также

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

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    5306    ivanov660    12    

56

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

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    9465    Evg-Lylyk    61    

44

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

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    5178    spyke    28    

49

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

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    7703    vasilev2015    20    

42

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

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12592    250    ZAOSTG    83    

115

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

Принимать, хранить и анализировать показания счетчиков (метрики) в базе 1С? Почему бы нет? Но это решение быстро привело к проблемам с производительностью при попытках построить какую-то более-менее сложную аналитику. Переход на PostgresSQL только временно решил проблему, т.к. количество записей уже исчислялось десятками миллионов и что-то сложное вычислить на таких объемах за разумное время становилось все сложнее. Кое-что уже практически невозможно. А что будет с производительностью через пару лет - представить страшно. Надо что-то предпринимать! В этой статье поделюсь своим первым опытом применения СУБД Clickhouse от Яндекс. Как работает, что может, как на нее планирую (если планирую) переходить, сравнение скорости работы, оценка производительности через пару лет, пример работы из 1С. Все это приправлено текстами запросов, кодом, алгоритмами выполненных действий и преподнесено вам для ознакомления в этой статье.

1 стартмани

24.01.2024    5782    glassman    18    

40

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

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    14551    doom2good    49    

71
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. e][tend 18.12.18 10:10 Сейчас в теме
За конфигурацию по разбору логов ТЖ спасибо!
ivanov660; shard; +2 Ответить
2. ivanov660 4582 18.12.18 10:20 Сейчас в теме
(1)
1. Спасибо всем нам) Буду рад если пригодится в работе. По вопросам и замечаниям, если будут пишите в секцию issue на GitHub проекта.
2. В ближайшем будущем мы планируем добавить еще некоторое количество полезного функционала.
3. Сейчас данная конфигурация у нас успешно работает в облаке для мониторинга проблемных ситуаций.
3. mpeg1989 131 18.12.18 11:47 Сейчас в теме
ИЛИ будет отрабатывать медленно, если отбор накладывается на разные поля. Пример:
Контрагент = &Контрагент ИЛИ Номенклатура = &Номенклатура.
Конструкция Контрагент = &Контрагент1 ИЛИ Контрагент = &Контрагент2 будет работать быстро.

Вложенные запросы сами по себе не страшны, плохо СОЕДИНЕНИЕ с вложенным запросом.

Соединение с виртуальной таблицей на уровне СУБД превращается в двойное соединение со вложенным запросом.

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

А в целом да - РЛС убирать, и отборы, отборы и еще раз отборы!
Dimkasan; tulakin_s; ProgrammistC; A_Max; +4 Ответить
4. ivanov660 4582 18.12.18 12:08 Сейчас в теме
(3) На счет индексирования. Недавно столкнулись с плавающим багом.

Относительно простой запрос по выборке выполнялся практически всегда быстро, но очень редко чертовски медленно - разница оказывалась порядка 100 раз. Смотрели сервер, потом планы запросов и выяснили, что их два: один хороший и оптимальный, а второй дурной со сканом. Так вот проблема была в том, что скуль иногда ошибался. Проблема решилась индексированием маленькой (в большинстве 40-50 записей) временной таблицы.
Поэтому в большинстве случаев настройки решение зависит от конкретной ситуации и окружения для рассматриваемой системы.
12. Silenser 612 26.12.19 09:02 Сейчас в теме
(4)

Относительно простой запрос по выборке выполнялся практически всегда быстро, но очень редко чертовски медленно - разница оказывала
Такое поведение больше похоже на кривую статистику, обновление которой происходит при реиндексации. В следующий раз, попробуйте обновить статистику индексов с фулсканом, возможно, поможет.
13. ivanov660 4582 26.12.19 09:49 Сейчас в теме
(12)Да, проблемы были связаны со статистикой, а также своеобразным взаимодействием версии 1с и SQL. Перестройка статистики в этом случае не помогла.
8. ProgrammistC 60 18.04.19 13:31 Сейчас в теме
(3)
таблицу.
абсолютно согласен с комментарием
5. Darklight 33 19.12.18 17:09 Сейчас в теме
Проект на git-hub не содержит значимых файлов сорсов (одни md). Или я что-то не понимаю.

А вот статья получилась очень познавательная, более менее хорошо написанная! Побольше бы таких статей! Так держать!
6. ivanov660 4582 20.12.18 07:08 Сейчас в теме
(5)это проект EDT и все необходимые файлы на месте.
Чтобы запустить вам нужен EDT и 1С.
Далее в хелпе нужно найти статью как подключиться к git и развернуть проект.
7. Darklight 33 20.12.18 14:29 Сейчас в теме
(6)Это всё понятно. Я извиняюсь, всё нашёл - просто криво в начале посмотрел
9. Alv_prog 11.12.19 17:33 Сейчас в теме
10. bugagashenka 203 23.12.19 06:04 Сейчас в теме
Не подскажете, чем в конфигурации парсите? Я так понимаю, скриптом?
11. ivanov660 4582 23.12.19 08:26 Сейчас в теме
14. mdie 86 04.02.20 17:28 Сейчас в теме
На просторах github'а, а также и на infostart'е встречалась утилита на Java для парсинга ТЖ. Подозреваю будет много лучше, чем RegExp из VB через COM
15. ivanov660 4582 04.02.20 17:39 Сейчас в теме
(14)
1. На мой взгляд, намного лучше будет, если 1С ники все же сделают нормальный структурированный вывод информации технологического журнала и не придется использовать все эти регулярные выражения.
2. Мы же преследовали цель все в одном флаконе на 1С для задач анализа быстродействия.
18. user925256 23.10.20 08:52 Сейчас в теме
(15)помогите скачать конфигурацию
19. ivanov660 4582 23.10.20 09:29 Сейчас в теме
(18) А в чем собственно проблема? У вас есть два варианта скачать тут (некоторым образом "поддержать" проект) или на GitHub.
20. user925256 23.10.20 10:34 Сейчас в теме
(18) проблемо с том что после скачивание цф или дт файла нет
22. ivanov660 4582 23.10.20 11:53 Сейчас в теме
(20)
1. Включаю телепата. При скачивании с GiutHub проекта, там нет cf (файла конфигурации). Да это действительно так, Вам надо установить EDT и скомпилировать проект.
2. Я уже писал выше. Повторю если вы хотите скачать cf, то воспользуйтесь infostart (файл в приложении и стоит 3 SM) или GitHub (доступны публикуемые релизы тут бесплатно). Красная или синяя таблетка, вот в чем вопрос)
16. mult1c 15.06.20 11:43 Сейчас в теме
Добрый день. В скачанном .cf нет отчетов\АРМ для просмотра - график PM.
17. ivanov660 4582 15.06.20 14:56 Сейчас в теме
(16) это отдельные обработки ищите на сайте проекта https://github.com/Polyplastic/1c-parsing-tech-log, вот тут master/parsing-tech-log-plugins/bin
21. user925256 23.10.20 11:52 Сейчас в теме
половина этих обработок видает ошибку а есть у вас уже гатовая база как в видео можте дать силку на базу, или мне самой надо исправить обработки под себя?
23. ivanov660 4582 23.10.20 11:57 Сейчас в теме
(21)
1. Готовой базы нет. Это не имеет смысла, т.к. окружение у всех свое. И демо базу также делать не вижу смысла.
2. Во-всех видео уроках и статьях я довольно подробно и качественно описал процесс настройки. Смотрите мои статьи на ресурсе infostart, качайте руководство https://infostart.ru/public/1156851/ и сборник всего сразу со ссылками на гитхаб https://github.com/Polyplastic/1c-parsing-tech-log/wiki
24. user925256 23.10.20 12:03 Сейчас в теме
ладно я разберус и попрашу сваих программистов подцепить все обработки в одну базу по моему так будет намного легко и просто и нагладно
25. ryzn 41 05.09.23 08:20 Сейчас в теме
Спасибо!!! Читалка есть, остальное сами...
26. a-grinyuk 06.04.24 18:05 Сейчас в теме
27. ivanov660 4582 06.04.24 22:35 Сейчас в теме
28. a-grinyuk 10.04.24 09:54 Сейчас в теме
(27)
А можно обработки и отчёты получить ? На github вижу, но как их сконвертировать без EDT не знаю. Без них конфигурация имеет мало смысла как я понял.
29. ivanov660 4582 10.04.24 14:59 Сейчас в теме
(28)
1. посмотрите на вкладке релизы (https://github.com/Polyplastic/1c-parsing-tech-log/releases)
или тут https://github.com/Polyplastic/1c-parsing-tech-log/tree/master/parsing-tech-log-plugins/bin
2. без них используется функционал работы с технологическим журналом, т.е. в некоторых случаях этого может быть достаточно
30. adamst 3 22.08.24 11:33 Сейчас в теме
ну просто вынуждают работать на EDT :)
Оставьте свое сообщение