Негативное влияние большого количества ролей на производительность 1С
Столкнулись с интересной проблемой во время работ с базой ERP. Первоначально проблема была в том, что один дописанный функционал работал слишком медленно и требовалось понять почему , однако вскоре выяснилась любопытная деталь – скорость выполнения операции под разными пользователями отличалась.
- Описание
- Подробнее
Описание
Проявляется она под пользователями, имеющими не административные права (в частности, на изменённом наборе прав «Администратор 2», по сути это тот же администратор но с вырезанными правами на некоторые разделы. Время проведения операции «Разузловка» для пользователей с разным набором прав отличается до нескольких раз (по наблюдениям пользователей с административными правами 2-3 минуты, с набором прав «Администратор 2» 10-12 минут). В связи с этим было решено провести нагрузочные тестирования, которые позволят локализовать проблему.
Сначала были сделаны замеры производительности при выполнении разузловки для разных пользователей что позволило обнаружить наиболее ресурсоемкий фрагмент кода, который происходит при разузловке. Как оказалось это типовой запрос, встроенный в общий модуль. Анализ показателей производительности демонстрирует существенную разницу во времени исполнения одного и того же фрагмента кода для разных наборов прав. Тесты производились множественные, как на разных пользователях, так и на одном пользователе с заменой прав, на разных базах (нагруженной – рабочей, не нагруженной — тестовой), что исключает случайный результат.
Администратор — Замер производительности
Администратор 2 — Замер производительности
Помимо решения задачи выявления узкого места в программном коде замеры производительности помогли сделать важные наблюдения по оптимальности общего сценария разузловки. Из важнейших моментов следует отметить, что выполняется не очень оптимальный запрос в цикле по количеству строк. Здесь имеется хороший ресурс в оптимизации процедуры разузловки: а) можно оптимизировать запрос; б) можно попробовать реализовать задачу разузловки не в цикле по строкам, а запросами по уровням разузловки. При этом следует заметить, что оба этих варианта оптимизации не предусматривают использование типовых механизмов, а могут быть решены одним из трех способов: а) внесением изменений в конфигурацию; б) на уровне расширения; в) внешней обработкой по обработке табличной части документа.
После обнаружения узкого места в виде запроса было решено проверить скорость его выполнения с разными настройками, в том числе как потенциальная причина снижения производительности была рассмотрена настройка РЛС, которая включается\выключается в разделе администрирования
Тесты были несколько раз перепроверены для исключения случайных результатов. Выводы по результатам: а) самое большое время исполнения у экспериментов, которые проводятся на наборе прав «Администратор 2»; б) Отключение РЛС давало прирос в скорости выполнения на разных правах, пользователях при разных нагрузках от 30% до 300%; в) Переход пользователя с прав «Администратор 2» на права «Администратор» давал прирост производительности от 5 до 20 раз (!).
Скорость выполнения запроса
Администратор 2, с включенным РЛС. Время выполнения 2.922
Администратор 2, с отключенным РЛС. Время выполнения = 2.125
Администратор, с отключенным РЛС. Время выполнения = 0.156
После получения результатов, явно указывающих на проблематику именно состава прав, было решено подробнее проанализировать роли набора прав «Администратор 2». Выяснилось, что в данном наборе содержится более 1000 ролей, что само по себе довольно необычно, при этом каких-то хорошо документированных и актуальных материалов о возможном наличии проблематики производительности именно из-за количества ролей в наборе прав найти не удалось. Поэтому было принято решение самостоятельно провести тестирование на предмет зависимости скорости выполнения запроса от количества ролей.
Выполнение запроса с разным количеством ролей в наборе прав
· 1000. Время выполнения = 1.188
· 500. Время выполнения = 0.375
· 250. Время выполнения = 0.265.
· 100. Время выполнения = 0.25.
· 50. Время выполнения = 0.203
Тестирования проводились так же многократно, чтоб избежать случайных отклонений, были получены следующие усредненные показатели зависимости времени выполнения запроса от количества ролей в наборе прав
Кол-во ролей | Время исполнения (сек) |
1000 | 1,1 |
500 | 0,38 |
250 | 0,27 |
100 | 0,25 |
50 | 0,2 |
Наблюдается устойчивая зависимость, что говорит о не очень большой скорости обработки большого количества ролей при исполнении кода на уровне платформы, при чем в нашем случае видно, что 1000 ролей – это для платформы сильно заметный скачок времени исполнения кода.
Заключение
Полученные результаты говорят о том, что у оптимизации разузловки возможны несколько шагов в порядке эффективности:
Пересборка наборов прав с уменьшением количества применяемых ролей.
Отключение РЛС, если это возможно.
Реинжиниринг процедуры разузловки на уровне кода с переписыванием запроса и исключением непроизводительного цикла.
Стоит отметить, что в данном конкретном случае большее влияние на производительность оказало именно количество ролей, нежели сам по себе включенный механизм РЛС, что было понятно после произведенных тестов на скорость выполнения запроса.