Предыдущие части:
В этой части рассмотрим методику тестирования.
Все нагрузочное тестирование состояло из трех тестов:
1. Имитация обращений 5000 пользователей к серверу сеансов;
2. Обработка задач службой workflow с использованием нескольких процессов;
3. Имитация нагрузки на СУБД при работе 5000 пользователей.
Остановимся более подробно на каждом из тестов.
Для начала тестирования нужно было определиться с профилем нагрузки. В этом нам успешно помог лог нашего сервера сеансов, в который записывается количество обращений каждого вида за период.
Примечание. Настраивается ведение лога в файле настроек сервера сеансов SBSessionSrvSettings.xml, следующим образом:
На основе анализа логов сервера сеансов был выделен профиль нагрузки.
Таблица 1. Профиль нагрузки на сервер сеансов
Вид обращения к серверу сеансов |
Частота (число операций для 100 пользователей в час) |
Обновление информации об активности клиента |
22142 |
Получение даты создания базы данных |
106 |
Получение ИД аппаратного окружения |
106 |
Получение даты инсталляции |
106 |
Получение количества лицензий |
4 |
Получение даты обновления shared-справочника |
2790 |
Получение версии сервера сеансов |
59 |
Проверка блокировки объекта |
8059 |
Блокировка объекта |
2045 |
Установить дату обновления shared-справочника |
38 |
Разблокировка объекта |
1894 |
Для имитации нагрузки на сервер сеансов была написана специальная утилита. Все обращения осуществлялись с использованием реальных методов, которые используются при работе пользователей. Для этого пришлось даже немного погрузиться во внутренний загадочный мир IS-Builder . Каждый вид обращения происходил в отдельном потоке.
Основными задачами здесь были проверка производительности службы workflow и работа при максимальном использовании всех ядер процессоров, а их было 8. При тестировании использовался профиль нагрузки, который создается 5000 пользователями при работе с задачами и заданиями.
Таблица 2. Профиль нагрузки на службу workflow
Операция |
Частота (число операций в час при работе 5000 пользователей) |
Старт задачи |
2000 |
Выполнение задания |
4500 |
Всего операций службы workflow |
6500 |
Также предварительно в очередь workflow было поставлено 3000 задач, которые находились в режиме ожидания и в процессе тестирования не обрабатывались.
Для проведения тестирования было создано два вида типовых маршрутов на базе стандартного «Совещания»:
1. В начало был добавлен блок «Задание», в качестве исполнителя которого использовалась вычисляемая роль, в которой случайным образом выбирались 1 … 6 пользователей. По этому ТМ создавались задачи, которые использовались для создания нагрузки.
2. В начало был добавлен блок «Ожидание». По этому ТМ создавались задачи перед тестирование, которые использовались для создания предварительной очереди для workflow (3000 задач, про которые упоминалось выше).
Для проведения тестирования предварительно в базе данных были созданы задачи в состоянии Инициализация по ТМ №1 и свободному маршруту в соотношении 1:4. Задачи создавались утилитой, описанной в предыдущей части.
Для самого тестирования была написана утилита, которая в отдельных потоках выполняла следующие действия:
1. Переводила задачи из состояния Инициализация в состояние В работе и ставила их в очередь обработки службой;
2. Переводила задания из состояния В работе в состоянии Выполнено и ставила задачу по заданию в очередь обработки службы.
На основе логов механизма профайлинга, были отобраны наиболее частые операции и их интенсивность. Схожие по назначению операции, часто выполняемые вместе, были сгруппированы в кейсы.
Таблица 3. Профиль нагрузки на СУБД
(операции пользователей, сгруппированные в кейсы)
Номер кейса |
Операция |
Вероятность выполнения операции |
Планируемое время отклика, сек |
Частота, число операций для 100 пользователей в час |
1 |
Создание, сохранение, старт задачи |
100% |
3 |
40 |
Просмотр прав на задачу |
18% |
1 |
7 |
|
2 |
Показ дерева задач |
100% |
1 |
601 |
Открытие задачи |
58% |
3 |
349 |
|
3 |
Выполнение задания |
100% |
4 |
90 |
4 |
Открытие версии документа |
100% |
3 |
864 |
Изменение версии документа |
22% |
5 |
190 |
|
5 |
Открытие карточки документа |
100% |
3 |
114 |
Изменение карточки документа |
68% |
3 |
78 |
|
6 |
Создание документа |
100% |
4 |
66 |
Просмотр прав на документ |
45% |
1 |
30 |
|
7 |
Проверка подписей документа |
100% |
4 |
114 |
8 |
Открытие справочника РКК («Регистрационно-контрольные карточки») |
100% |
3 |
94 |
Создание РКК |
16% |
4 |
15 |
|
9 |
Открытие карточки РКК |
100% |
3 |
99 |
Изменение РКК |
54% |
4 |
53 |
|
10 |
Открытие справочника ОРГ («Организации») |
100% |
3 |
479 |
Создание ОРГ |
12% |
4 |
57 |
|
11 |
Открытие карточки ОРГ |
100% |
3 |
240 |
Изменение ОРГ |
35% |
4 |
84 |
|
12 |
Получение содержимого папки |
100% |
1 |
515 |
Изменение содержимого папки |
19% |
1 |
98 |
Для проведения данного тестирования был использован инструмент Visual Studio Test Edition 2008. Предназначен он для нагрузочного тестирования веб-приложений, но как оказалось можно использовать и для другого тестирования.
Суть тестирования заключалась в следующем:
1. Каждый виртуальный пользователь сопоставлялся с реальным пользователем в системе DIRECTUM;
2. От имени каждого пользователя создавалось соединение с базой данных, которое держалось открытым в течение всего теста;
3. При тестировании каждый пользователь с определенной периодичностью выполнял кейсы. Кейсы представляли собой параметризированные sql-запросы реальных операций.
Вот маленький кусочек кейса
Dim CommandText As New StringBuilder()
Dim UserID As Integer = Me.Context.WebTestUserId
Dim SQLConnection As New SqlConnection()
Dim UsersParams As New LoadTestPlagin.UserParams
UsersParams = UserParamsList(UserID)
Dim DirUserID As String = UsersParams.DirUserID
SQLConnection = UsersParams.Connection
Dim SqlCommand As New SqlCommand()
SqlCommand.Connection = SQLConnection
Randomize()
Dim Index As Integer = CInt(Int(5 * Rnd()) + 1)
Dim EdocID As Integer = UsersParams.IDDocForChangeVerArr.GetValue(Index - 1)
CommandText.AppendLine("select")
CommandText.AppendLine(" EDocumentType.Kod")
CommandText.AppendLine("from")
CommandText.AppendLine(" SBEDoc EDocument,")
CommandText.AppendLine(" MBEDocType EDocumentType")
CommandText.AppendLine("where")
CommandText.AppendLine(" EDocument.XRecID = " & EdocID.ToString)
CommandText.AppendLine(" and EDocumentType.TypeID = EDocument.TypeID")
SqlCommand.CommandText = CommandText.ToString
SqlCommand.ExecuteNonQuery()
CommandText.Length = 0
…
Спасибо за интересную статью, но хотелось бы узнать ещё и конфигурацию железа, на котором всё это "жило", чтобы лучше оценить.
Спасибо.
Авторизуйтесь, чтобы написать комментарий