(Проект и персонажи вымышлены, любые совпадения случайны)
- Чебуршка, нам нужно начать поставки нашей новой системы по мониторингу и управлению апельсиновыми плантациями через три месяца, а данных, какую максимальную нагрузку сможет поддерживать наша система - нет! Да и в стабильности работы нашей системы продолжительное время мы не уверены...
- Геннадий, давай я тебе напомню, что у нас не простой веб сервис, который можно нагрузить запросами при помощи JMeter и получить показатель в секунду. У нас реактивная система по обработке потока данных и принятию решений в реальном времени, работающая на Raspberry Pi, которая должна решать задачи по мониторингу, управлению и увеличению эффективности апельсиновой плантации с минимальным энергопотреблением. Давай я тебе напомню архитектуру нашего приложения:
(Чебурашка быстро нарисовал на доске следующую диаграмму для Гены)
- Ты смеешься надо мной, Чебурашка?! Я же на английском ничего не понимаю!
- Управляете интернациональной корпорацией, Геннадий... Пора бы уже... Давай ближе к теме. У нас имеется система по контролю и мониторингу апельсиновой плантации, которая должна располагаться на территории данной плантации, работать без подключения к электрической сети, на электроэнергии, получаемой от солнечных панелей. Система в режиме реального времени должна обрабатывать сигналы с датчиков (например влажность почвы конкретного дерева), и автоматически отправлять команды контроллерам (к примеру, системы полива этого апельсинового дерева). Также система позволяет подключаться к ней с внешнего устройства (ноутбук, планшет, смартфон), с возможностью проверки общего состояния, изменения конфигурации и анализа данных.
- Чебурашка, я тебе вопрос о производительности задал! Я не просил пересказывать отрывок из презентации для инвесторов... Давай ближе к теме!
- К этому я и подвожу. Исходя из специфики и отсутствия четких требований по производительности со стороны заказчика, производительность нашей системы можно будет охарактеризовать ответами на следующие вопросы:
Какой максимальный размер апельсиновой плантации, управление которой наша система поддерживает?
Как продолжительно система может работать на плантации данного размера?
Как система ведет себя в критичных условиях (пиковая нагрузка, нехватка места в хранилище, отключение от источника питания) и как успешно восстанавливается?
Прежде чем перейти к решению данных вопросов, давайте разберем виды тестов производительности:
Throughput | Load | Peak/Stress/Endurance | |
Goal | How much data per second can the system handle? | How the system behaves under real-life load during the time? | What is the limit for the system? |
Issues to find | Bottlenecks | Memory leaks Concurrency issues High CPU / RAM / Disk / Network of individual component Hardware issues, for example overheating | Data corruption Hardware corruption Recovery issues |
- Вот, Чебурашка, можешь ведь изъясняться и на русском, когда захочешь!
- Наша главная сложность, что мы не знаем в каких условиях будет находиться наша система у заказчика, также мы не знаем количественные и качественные показатели данных, которые будет потреблять система. И у нас нет реальной апельсиновой плантации рядом с офисом, чтобы проверить это. Мы можем эмулировать данные, но это может оказаться далеко от правды.
- Ты же умный парень, Чебурашка! Я помню, что когда ты задаешь мне вопрос, у тебя, как правило, уже есть варианты ответа. Не зря же я тебя назначил на должность архитектора с зарплатой в одну тысячу долларов в месяц!
- Спасибо, что платите не апельсинами, как в прошлом году... Итак к делу. Я предлагаю установить прототип нашей системы на плантацию к заказчику и оставить ее работать в режиме записи данных с сенсоров и использования системных ресурсов на неделю. На основе этих данных мы сможем сконфигурировать эмуляторы и запустить тесты.
- Отлично, так и сделаем! Я согласую это с заказчиками прямо сегодня!
- Геннадий, давай я тебе расскажу об отдельном приложении, которое я разработал специально для проведения всех названных выше типов тестов производительности. Это приложение отвечает за запуск сценариев тестов, управление эмуляторами, сбор данных потребления ресурсов (CPU, Memory, Disk I/O, DIsk space usage, Network I/O) всей системой, так и отдельными компонентами, количество ошибок в логах, пропускную способность системы и целостность данных.
- Почему ты не использовал какое-либо готовое решение? Я слышал про такие инструменты для нагрузочного тестирования, как Gatling или Tank от Яндекса?
- Хороший вопрос. Я изучил возможности данных инструментов и нашел их недостаточно гибкими для наших задач. Было принято решение разработать систему с нуля. Коротко опишу данную систему:
Приложение тестов производительности поддерживает как тестирование всего приложения, включая UI (который, в нашем случае является толстым клиентом и выполняет определенное количество интенсивных операций с данными), так и отдельных частей и компонентов.
Через пару месяцев...
- Добрый день, Чебурашка! Какие результаты нагрузочных тестов?
- Добрый день, Геннадий! При помощи нашей системы тестов производительности мы смогли обнаружить и исправить множество дефектов и узких мест, также мы внедрили нагрузочные тесты в CI/CD Pipeline и мы запускаем их регулярно.
Мы можем сказать, что:
Один экземпляр системы способен работать на плантации площадью до 5 гектаров с количеством деревьев до 1250 штук (Далее: "стандартные условия").
Система с хранилищем в 128 Гб в стандартных условиях способна непрерывно работать более 1 месяца.
При экстренном отключении, данные остаются на энергонезависимом хранилище. Система автоматически запуститься и продолжит работу при восстановлении питания.
- Приятно слышать, Чебурашка! Будем планировать поставку. Надеюсь, ты не собрался в отпуск после проделанной работы. Ты ведь и так там был не давно, в позапрошлом году. А нам теперь нужно будет срочно спроектировать следующую версию системы, которая сможет контролировать работу сборщиков урожая...
- Обсудим. Но это уже другая история...