В последние лет пять про облачные технологии слышно все чаще. Microsoft и Amazon отчитываются о высоком росте доли облачных сервисов в отчетах о прибыли. Российский Яндекс относительно давно продвигает свое Облако. К этому подключился и Сбер со своим облачным продуктом. Часто можно услышать и о других, менее крупных игроках.
Смотря на все это многообразие я подумал, что происходит какая-то вечеринка, а меня не пригласили. Ну что же, давайте присоединимся к этой вечеринке сами разместив сайт на Azure и сравнив тарифы службы приложений и службы БД.
Цель этой статьи можно выразить в 2х пунктах:
С одной стороны мы познакомимся с тарифными планами службы веб-приложений и службы хостинга баз данных
С другой стороны мы проведем нагрузочное тестирование тремя стратегиями тестирования в разрезе разных тарифных планов
Чтобы добиться нашей цели мы сделаем следующее:
Разместим на Azure сайт
Подадим на него нагрузку и проверим, как инфраструктура Azure с ней справляется
Будем менять разные тарифы и разные стратегии нагрузочного тестирования и снова подавать нагрузку
Зафиксируем результаты и сравним их
Ограничение: из-за большого числа моделей использования БД, ограничимся только оплатой при использовании модели приобретения DTU. Подробнее здесь.
Что такое облачный хостинг MS Azure?
Аудитория читателей может и не знать, что такое MS Azure, поэтому несколько слов о том, что такое облачный хостинг Azure
MS Azure - это облачная платформа, которая включает более 600 продуктов и облачных служб. Цифра актуальна на сентябрь 2021 года. Мне нравится эта иллюстрация личного кабинета. Она показывает богатство выбора.
Кроме того платформа Azure обладает такими свойствами. Я выбрал не книжный список, а тот, на который обратил внимания сам:
Распределенная. Про это немного ниже
Вертикально масштабируема. Служба базы данных и служба хостинга веб-приложений могут масштабировать свои мощности движением одного ползунка. В рамках моего эксперимента изменения применяются в течении нескольких секунд. Эта возможность вызывала очень отрадное чувство. Круто!
Горизонтально масштабируема. В целом горизонтальное масштабирование предполагает, что вместо 1 машины вы используете 2 и более машины. И это действительно оправданно, когда вы уперлись в потолок вертикального масштабирования. В MS Azure есть эта возможность, но мы пока ограничимся вертикальным масштабированием
Легкая в использовании. С одной стороны Azure предполагает еще один слой абстракции. И это скорей минус, а не плюс. С другой стороны знакомство с этим новым слоем абстракции происходит довольно легко. А сайт и база данных после настройки летят в облако по нажатию одной кнопки. Так же легко настроить панель мониторинга. И при этом не нужен отдельный специалист по девопсии
Дружелюбна к другим вендорам. Евангелисты Майкрософта очень стараются донести, что Майкрософт повернулся лицом к Unix OC. И это действительно видно при выборе служб Azure.
Предоставляет службы базирующиеся не сторонних вендорах. Например ElasticSearch, Redis, Kafka
В то же время:
Не подходит для хостинга персональных данных из-за 152-ФЗ, т.к. в России нет физических серверов Azure
Дорого. В сравнении тарифов я затронул этот аспект
Говоря про Azure нужно отметить географию присутствия сервиса
География важна по следующим причинам: 1)от нее зависит цена 2) вы наверняка захотите, чтобы физические сервера находились ближе к вашим пользователям. Т.к. большое расстояние передачи данных влияет как на пропускную способность канала, так и на отклик. 3) есть риск попасть под 152ФЗ. И к сожалению для России он срабатывает в негативную сторону. В России нет официального присутствия MS Azure. Зато есть вендоры
Например:
МТС
lancloud.ru
Однако и тут есть нюансы.Так на сайте MTS Облака в разделе Azure Stack представлены лишь 7 служб, только виртуальные машины и диски. Как писал выше у Azure от Microsoft более 600 служб
1cloud.ru служит только для того, чтобы финансовые взаиморасчеты происходили с российской компанией. Технически это тот же Microsoft Azure, тот же личный кабинет от Microsoft, та же локация серверов не в России
Сайт, на котором будем проводить тест
Как и говорилось выше, тестировать Azure мы будем на не большом, но реальном сайте. Этот сайт несет свою бизнес ценность, а именно - показывает сколько стоят детские товары у разных ретейлеров. Сайт «Мое Молоко» собирает данные у «Перекрестка» и «Утконоса» раз в сутки и сохраняет цену в базе данных в облаке Azure. Мамы и папы, которые хотят сэкономить на детских товарах, заходят на «Мое молоко» и выбирают подгузники по самой дешевой цене. Затем переходят на сайт ретейлера и делают у него заказ
С технической точки зрения у нас есть сайт на ASP.NET Core MVC. Рендеринг происходит на серверной стороне и BackEnd сайта отдает браузеру готовый HTML. Так же на BackEnd сайта настроена служба, которая просыпается раз в сутки и стучится на сайт к ретейлерам. Utkonos отдает JSON и нужные нам поля уже разложены по строкам. Perekrestok отдает HTML, который разбирать сложно, но можно. В итоге BackEnd сопоставляет полученные позиции между собой и заносит результаты в БД MS SQL Server
Таким образом мы используем службы:
App Service или служба приложений. Простыми словами с помощью этой службы можно хостить сайта
SQL Database или службу баз данных
Еще из платных услуг мы применим Storage Blob. Но необходимость в этой службе вызвана тем, что нам нужно применять командную строку - Azure CLI. И стоит он по сравнению с другими двумя службами совсем не много. Служба мониторинга и сбора логов производительности применится без каких-либо сложных телодвижений. Нам нужно будет лишь добавить виджеты и настроить панель управления. Делается это очень просто, этим Azure ну очень подкупает!
На схеме ниже можно увидеть желтую иконку SmartBear SoapUI. Это приложение для нагрузочного тестирования, которе будет имитировать нашего клиента и запрашивать у сайта страницы сравнения цен. Метрики производительности сайта мы будем отслеживать как с помощью SoapUI, так и с помощью внутренней панели мониторинга нашего облака
Осталось сказать про тарифные планы
Тарифные планы службы приложений
Нашу службу я решил поднять в Западной Европе - West Europe. Наши пользователи в Москве и географически этот вариант ближе всего.
В целом есть такие варианты:
Australia Central
Australia East
Australia Southeast
Brazil South
Canada Central
Canada East
Central India
Central US
East Asia
East US
East US 2
France Central
Germany West Central
Japan East
Japan West
Korea Central
Korea South
North Central US
North Europe
Norway East
South Africa North
South Central US
South India
Southeast Asia
Switzerland North
UAE North
UK South
UK West
West Central US
West Europe
West India
West US
West US 2
От географии зависит стоимость. Сам набор тарифов в зависимости от географии сильно не отличается, по крайней мере на первый взгляд. Но в долгосрочной перспективе возникает эффект экономии масштаба.
С точки зрения разделения ресурсов есть такие варианты: Общий (Shared), Выделенный (Dedicated), Изолированный (Isolated). Вот тут описана разница. На момент написания статьи для Западной Европы было доступно 17 Общих и Выделенных тарифов. Изолированные не доступны по какой-то причине на обычной учетной записи
Полный перечень тарифов для служб приложений можно посмотреть тут - https://azure.microsoft.com/ru-ru/pricing/details/app-service/windows/
Мы для своих экспериментов остановимся на этих 4х:
Обозначение тарифа |
Ограничение по CPU |
Память |
Тип вычислений |
Цена в месяц (приблизительно) |
F1 |
60 мин вычислений в день, 1.5 минуты вычислений в 5 минут |
1 ГБ |
Общая - Shared |
Бесплатно |
B1 |
без ограничений по времени |
1.75 ГБ |
Выделенная - Dedicated |
46.17 EUR |
P1V2 |
без ограничений по времени |
3.5 ГБ |
Выделенная - Dedicated |
123.12 EUR |
P2V2 |
без ограничений по времени |
3.5 ГБ |
Выделенная - Dedicated |
246.24 EUR |
При этом у тарифа F1 есть одна интересная особенность - лимит по процессорному времени - 60 минут в день. При этом каждые 5 минут лимит по процессорному времени - 1.5 минуты. Получается Майкрософт привирает, когда говорит, что он ряд служб предоставляют в бесплатное пользование. А по рекламе складывается другой посыл
Тарифные планы службы БД SQL
Служба база данных поднята тоже в Восточной Европе. Из всей массы тарифных планов выберем такие:
Предоставленные ресурсы DTU |
Допустимый объем и тип диска |
Цена в месяц (приблизительно) |
Базовый 5DTU(Basic) |
HDD: 100Мб - 2Гб |
4,21 EUR |
Стандартный 10DTU(S0) |
HDD: 100Мб - 250Гб |
12,65 EUR |
Стандартный 20DTU(S1) |
HDD: 100Мб - 250Гб |
25,3 EUR |
Я выбрал модель оплаты основанную на DTU (Database transaction units). DTU - это метрика производительности. Пример аналога в нашей жизни - лошадиные силы. DTU собирает в себе производительность процессора, памяти и операций ввода-вывода. Система оплаты строится так, что вы платите за сервис с заданной мощностью. Даже если вы не будете расходовать ресурсы сервиса, то счет Microsoft все равно выставит. Это довольно существенный минус, а жаль. Правда плюс в том, что количество DTU можно менять в любой момент. Да и вообще есть модель оплаты на основе виртуальных ядер.
Подробнее про DTU можно почитать тут
А про ограничении ресурсов при использовании модели оплаты по DTU тут
Методика тестирования
Нагрузка на сервисы запущенные в продакшене не линейна. Я так же хочу приблизить наше тестирование к продкшн нагрузке. Поэтому в нашем тестировании будет заложены 3 стратегии:
Выявление базовой нагрузки - Baseline
Воздействие единичной функцией - Soak
Воздействие дельта-функцией - Burst
1 я стратегия позволит нам понять, после какого числа запросов наш сервис начнет отдавать запросы с Response time превышающим минимальный порог.
2я и 3я стратегии взяты из теории переходных процессов. Когда на систему подавали бесконечно большое воздействие, но за короткий промежуток времени - воздействие дельта функцией. А так же воздействие постоянным значением равным единице, но бесконечно долго - воздействие единичной функцией. В реальном мире дельта функция не будет бесконечно большой, но будет превышать базовую нагрузку. А единичная функция не будет бесконечно длинной, но воздействовать будет порядка 5 минут. Такое воздействие и коротким не назовешь. Хотя признаю, что в настоящей промышленной эксплуатации сайт держат под нагрузкой 24 часа, чтобы ловить возможные накопившиеся утечки памяти.
Теперь скомбинируем наши стратегии, тарифы БД, тарифы службы приложений и посмотрим на весь план тестирования:
Комбинаций получается много и в целях экономии времени оставим для тестов типа Soak и Baseline только крайние значения платных тарифов. Итого получится 20 тестов.
Последовательность тестирования будет такой:
Для каждой комбинации тарифов выясним базовую линию. Вычислим RPS1 при котором Response time не будет превышать 5 секунд. Baseline test.
Для выбранных комбинаций тарифов сделаем нагрузку равную RPS1 в течении 5 минут. Soak test.
Для выбранных комбинаций тарифов сделаем нагрузку равную 2*RPS1 по 10 секунд и паузой по 10 секунд в течении 3 минут. Burst test
С точки зрения производительности нас интересуют 2 метрики:
Число запросов в секунду - RPS
Отклик - Response time
Фиксация результатов
Запускать тест и фиксировать результаты тестирования будем в программе SmartBear SoapUI. Важный нюанс. В расчетных данных tps (transaction per second. Когда в тесте один запрос TPS = RPS) я обнаружил ошибку отбрасывания знаков после запятой. Встречалась часто. Из-за этого я решил выгружать сырые данные и считать RPS вручную.
Кроме того я воспользовался панелью мониторинга Azure. Метрики в ней можно разделить на 2 категории:
-
Производительность
Число запросов в секунду - RPS
Отклик - Response time
-
Затраченные ресурсы
Max CPU Percentage for App - максимальный процент использования ЦП всеми экземплярами плана
Average memory working set for App - средний объем памяти в мегабайтах (МБ), используемый приложением
Max Memory Percentage for App - процент использование памяти всеми экземплярами плана
Max DTU used for DB - максимально используемое DTU. О том что это, я писал выше
Max CPU percentage for DB - максимальный процент использования ЦП
Тестирование
Теперь, когда определены все начальные данные, можно начать тестирование. И вот что получилось:
Анализ результатов
Нагрузка, ответов в секунду, RPS (response per second)
Отклик, Avg Response time, миллисекунды
Max CPU Percentage for App, % (Max значение за период теста)
Max Memory Percentage for App, % (Max значение за период теста)
Max CPU percentage for DB, % (Max значение за период теста)
Стоимость, руб
Выводы из тестирования
При анализе результатов важно понимать, что в веб-приложении отключен кэш. Приложение при каждой обработке запроса лезет в базу и собирает товары с ценами и склеивает их по имени. При этом имена товаров в разных торговых сетях отличаются и нужно для каждого товара запускать алгоритм соответствия имен, который отбирает очень много ресурсов. Кэширование отключено, чтобы по-больше загрузить веб-приложение.
Тариф БД для нашего сайта никак не влияет на RPS и отклик. Однако чем лучше тариф БД, тем больший запас по процессору для БД у нас есть. И это значит, что БД на хорошем тарифе имеет запас мощности и готовность к новым нагрузкам
Для службы БД важно следить за загрузкой жесткого диска. Однако мониторинг службы БД почему-то не показывал операции ввод/вывода и они всегда были на 0
Эксперимент выполнен с отключенным кэшем службы приложений. Однако судя по «загрузке процессора службы БД» и по ResponseTime запрос в БД был закэширован на уровне базы данных
Тариф службы приложений B1 едва ли справляется с нагрузкой в 1 RPS.
Зато тариф службы приложений P2V2 выдерживает нагрузку в несколько RPS при отклике не сильно более 1 секунды.
Так же говоря о загрузке процессора стоит последить не за пиковой (Max) загрузкой процессора службы приложений, а за средний (Avg). Т.к. службы приложения пиковая загрузка процессора почти всегда доходила до 100%
Облачный хостинг удобен в работе, позволяет быстро масштабировать мощность как вертикально, так и горизонтально. Когда ты всего лишь двигаешь 2 ползунка, а твой сайт становится более производительным, это конечно вызывает максимально положительные впечатления
Но MS Azure стоит дорого и его инфраструктуры нет в России. Поэтому стоит присмотреться еще и к Яндекс.Cloud, или SberCloud, или Azure Stack от МТС и оценить их
Что дальше?
Было бы интересно запустить тот же сайт на более привычном хостинге VPS начальных уровней за 1000р в год. И сравнить производительность сайта при прочих равных условиях. Пишите, если вам тоже было бы интересно узнать о результатах.
Комментарии (9)
Fulborg
16.09.2021 17:11+1Несколько странно говорить сначала про то какая у Azure хорошая инфраструктура, и как много продуктов она в себя включает, а потом делать тест производительности сайта без использования всей этой специфики.
Используемый в статье вариант — безусловно гибкий, консольное приложение + SQL можно развернуть где угодно, но в этом же и проблема этого теста.
Если же подходить к вопросу с точки зрения «cloud-first», можно было бы:
1) Вместо AppService, воспользоваться Static Web Apps, которые на порядок дешевле. Как понимаю по описанию, какой-то сложной логики на серверной части *клиентского приложения* — нет.
2) Вместо классического SQL — взять Azure Blob Storage, либо CosmosDB. Consumption-based планы обойдутся дешевле при ограниченной аудитории приложения. Да и при большой, чтение одного блоба с данными с Blob Storage — будет дешевле запросов к SQL.
3) Обновление данных с сайтов магазинов — сделать через Azure Function. Из коробки Durability, триггеры срабатывающие по расписанию, опять же Consumption-based биллинг. Учитывая что джоб выполняется раз в сутки и не CPU-heavy — ценник будет небольшой.smarkov Автор
16.09.2021 22:15В вашем ответе есть что растащить на Гугл-запросы) спасибо за такой развернутый ответ) БД MS SQL выбрана как наиболее знакомая мне из майкрософтовского стэка, служба приложений маячила перед глазами при изучении Azure
Drag13
17.09.2021 13:49Вместо AppService, воспользоваться Static Web Apps
Gридется переписать клиент — мигрировать с Razor-a на API, потом решать проблемы с SEO. Мне кажется будут сложности.
polarnik
21.09.2021 10:51+1Привет! Тестовый агент с SoapUI запускался на локальной станции, на ноутбуке?
Результат в RPS мог получиться скромным из-за запуска теста через интернет. По ряду причин:
исчерпание TCP-подключений, проблема TCP Time Wait в Windows также актуальна, как и в Linux
лимиты сетевого провайдера, иногда это троттлинг (защита от DoS со стороны абонента) иногда просто ограничение пропускной способности
лимиты Azure (защита от DDoS/DoS на стороне площадки)
Скорее всего первая причина
Стоит проверить рекомендации из статьи базы знаний Microsoft:
https://docs.microsoft.com/ru-ru/windows/client-management/troubleshoot-tcpip-port-exhaust
и по возможности повторить замер. Или провести замер, подавая нагрузку со станции внутри кластера.
Также некоторые инструменты не закрывают TCP-подключение к серверу, поэтому они иногда заявляют, что обгоняют по производительности инструменты которые закрывают и открывают снова.
Инструменты, которые закрывают подключения после каждого теста:
Apache.JMeter, но если в конфигурационный файл jmeter.properties внести настройку httpclient.reset_state_on_thread_group_iteration=false, то тоже не будет закрывать
Gatling, но если в настройки http-протокола добавить shareConnections , то тоже не будут, пример.
Инструменты, которые не закрывают подключения:
k6
ab
Как поступает Soap UI не знаю, и не знаю если ли у него настройки для изменения поведения.
Резюмируя: изменение инструмента или его настроек также можно повысить RPS
smarkov Автор
29.09.2021 14:52Добрый день, спасибо за коммент,
Soapui запускался с ноутбука и доводы, которые вы привели действительно важные. Но в моем случае они скорей всего не актуальны по следующим причинам:
Я выставлял на том же приложении статическую страницу и получал по ней несколько десятков rps
Загрузка процессора в службе приложения была близкой к максимуму. Можно посмотреть на сравнительной таблице выше в статье
Может ли быть, что производительность по статической странице выполнялось в ограниченном количестве tcp/ip соединений. Думаю да. Но загрузка процессора службы приложений говорит, что дело в загрузке процессора на серверной стороне.
Ну и просто для информации: SoapUI не закрывает tcp/ip соединение пока не закончит весь тест. Но на сколько помню, это можно параметризировать
Zaphkiel
Что-то очень маленькая производительность получилась «Тариф службы приложений B1 едва ли справляется с нагрузкой в 1 RPS.», как так то?
Осталось непонятным где именно проседает производительность, что это за «алгоритм соответствия имен, который отбирает очень много ресурсов»? Как вообще выглядит само приложение изнутри?
Drag13
Лет 5 назад у коллег были проблемы с MS-SQL в Ажуре, не помогали даже дорогие варинты, но после я никаких проблем не испытввал.
И да, очень странно видеть на тарифе P2V2 за 250 евро 4 РПС. Т.е. наверное это возможно (тем более что сам автор пишет про отключенные кеши и сложные вычисления), но прямо очень удивительно. Будет время - попробуем провести свое микронагрзучное и выложить на Хабр. Если результаты повторятся - даже не знаю, съем свою шляпу что ли.
smarkov Автор
@Zaphkiel@Drag13производительность безусловно низкая. Под капотом EntityFramework, которым я пользуюсь в первый раз, ну и в целом программирование для меня это хобби. Поэтому тут проблемы не в Azure, а в не оптимальном коде. Его я собираюсь пересмотреть и улучшить. А сейчас по крайней мере я смог сравнить тарифы между собой и попробовать разные стратегии тестирования на Azure
Drag13
Я пока набросла черновой код, на выходных задеплою, разверну БД (я взял StakOverflow БД за 2010 год) и посмотрим что там выйдет.