2. В докладе
• Введение
• Концепция PTDD
Performance Test Driven Development
• Распределённыйнагрузочныйтест–чтоэто?
• Стек инструментов
• Пример теста
5. PerformanceTestDrivenDevelopment
• Пишем неоптимизированный код
• Пишем нагрузочные тесты / бенчмарк
• Исправляем проблемы производительности
• Организуем изолированные тесты в профили
нагрузки по мере добавления функционала
• Непрерывное тестирование производительности
6. Как тестировать до “начала”?
Нет скрипов, инфраструктуры, приложения
Надо тестировать базовые сценарии
Тестировать на реальном масштабе
Тестировать сценарии отказов
Дизайн меняется на ходу, тесты вместе с ним
Тесты должны гонять себя сами, у
разработчиков хватает работы.
7. Как тестировать до “начала”?
На чём вы пишите юнит-тесты?
• JUnit - Java
Почему бы не писать нагрузочные также?
• Мы знаем Java
• На Java есть библиотеки для всего
• Никаких переформанс инженеров
тесты пишут разработчики
8. Вопрос культуры
“Классический” подход
• bash + ssh + анализ логов + Excel / R
• Мало пригоден для повторного использования
• Короткий период полураспада тестов
• Использование незнакомого инструментария
“Монокультурный” подход
• Платформаприложения=платформаавтоматизации
− Приходится изобретать велосипеды, но
+ Решается проблема культурного диссонанса
9. Нагрузочный тест
Развёртывание
В распределённой среде
Подготовка данных / разогрев
Сценарий тестирования
Например,дневнойпрофильнагрузкисотказомузлавкластера
Сбор метрик
Тестовые события
Метрики ОС
Данные профилирования
Подготовка отчёта
10. Стек инструментов
Nanocloud - https://github.com/gridkit/nanocloud/
Развертывание / управление распределённой средой
GridBeans – “массивно параллельная” Java
Оркестрация развертывая и подготовки
Выполнение сценария
Nimble
Компоненты: cбор данных, мониторинг и прочее
Отчёты
Сырой CSV на выходе, решение не найдено
12. Nanocloud
Удалённое выполнения Java кода
Просто как …
@Test
public void hello_remote_world() {
Cloud cloud = CloudFactory.createSimpleSshCloud();
cloud.node("myserver.acme.com").exec(new Callable<Void>(){
@Override
public Void call() throws Exception {
String localhost = InetAddress.getLocalHost().toString();
System.out.println("Hi! I'm running on " + localhost);
return null;
}
});
}
13. All you need is …
NanoCloud requirements
SSHd
Java (1.6 and above) present
Works though NAT and firewalls
Works on Amazon EC2
Works everywhere where SSH works
14. Master – slave communications
Master process Slave hostSSH
(Single TCP)
Slave
Slave
RMI
(TCP)
std err
std out
std in
diag
Slave
controller
Slave
controller
multiplexed slave streams Agent
15. Death clock is ticking
Master JVM kills slave processes, unless
SSH session was interrupted
someone kill -9 master JVM
master JVM has crashed (e.g.underdebuger)
Death clock is ticking on slave though
if master is not responding
slave process will terminate itself
16. Cloud scale JVM
Same API – different topoligies
in-process (debug), local, remote (distributed)
Transparent remoting
SSH to manage remote server
Automatic classpath replication (with caching)
Zero infrastructure
Any OS for master host
SSHd + JVM for slave hosts (Unix / Cygwin)
200+ slave topology in routinely used
18. Распределённый сценарий
• Простые шаги (реализованные на Java)
• Выполняемые в распределённой системе
согласно сценарию
• Возможность синхронизации шагов
• Обмен данными между шагами
• Нет циклов и условного выполнения
• Fail fast – ошибка любого шага
завершает сценарий
20. Mockito way
1. Декларация намерений
Моки и вызовы методов
“Виртуальное” время
“Абстрактная” распределённость
2. Физическое выполнение
Привязка к топологии
Зависимости между шагами
Параллельное / распределённое выполнение
23. Простой пример #1
Драйвер
Интерфейс декларирующий шаги
Шаги – методы
Шаг может вернуть “интерфейс”
Шаги могут принимать параметры
Сериализуемые объекты
Результаты выполнения шагов
Реализация драйвера размещается в
распределённой среде используя локатор
29. Простой пример #2
Ошибка выполнение шага отлавливается
и завершает сценарий.
Когда создаётся фоновая задача, используется
Activity.join() шага, который не завершится пока
задача не будет остановлена.
Wallclock – драйвер предоставляемый из коробки.
ExecutionDriver – пример вспомогательного
драйвера.
31. Распределённый сценарий
Fallacies of distributed computing
https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
• The network is reliable – fail test fast.
• Latency is zero – small number of round trip.
• Bandwidth is infinite – low bandwidth control flow.
• The network is secure – irrelevant for testing.
• Topology doesn't change – fail test fast and rerun.
• There is one administrator – zero deployment.
• Transport cost is zero – there is no free lunch
• The network is homogeneous – location conscious scenario.
33. Метеринг
Сбор метрик в распределённой среде
Данные тестовых событий
Данные мониторинга
Метрики аккумулируются на локальном
диске и передаются на управляющий узел
по завершении сценария
Все результаты экспортируются в CSV файл
большой CSV файл
34. Мониторинг
Метрики OS - https://github.com/hyperic/sigar
Network interface stats
Process stats (поиск нужных процессов)
JVM
GC
Threads
Custom MBeans
Build your own
35. Профилирование
BTrace 2 - https://github.com/jbachorik/btrace2
Инструментирующий профайлер
Точки перехвата на Java
Развёртывание как часть сценария
Интеграция с метерингом