Проявляется она под пользователями, имеющими не административные права (в частности, на изменённом наборе прав «Администратор 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 ролей – это для платформы сильно заметный скачок времени исполнения кода.
Заключение
Полученные результаты говорят о том, что у оптимизации разузловки возможны несколько шагов в порядке эффективности:
-
Пересборка наборов прав с уменьшением количества применяемых ролей.
-
Отключение РЛС, если это возможно.
-
Реинжиниринг процедуры разузловки на уровне кода с переписыванием запроса и исключением непроизводительного цикла.
Стоит отметить, что в данном конкретном случае большее влияние на производительность оказало именно количество ролей, нежели сам по себе включенный механизм РЛС, что было понятно после произведенных тестов на скорость выполнения запроса.