SlideShare a Scribd company logo
Распределённое нагрузочное
тестирование на Java
Алексей Рагозин
Артём Панасюк
jug.msk.ru 2016
В докладе
• Введение
• Концепция PTDD
Performance Test Driven Development
• Распределённыйнагрузочныйтест–чтоэто?
• Стек инструментов
• Пример теста
Тестирование
– инструмент познания мира
PerformanceTestDrivenDevelopment
Функциональное тестирование
Нагрузочное тестирование
Cost of bug
Test volume
Release
Release
Test volumeCost of bug
PerformanceTestDrivenDevelopment
• Пишем неоптимизированный код
• Пишем нагрузочные тесты / бенчмарк
• Исправляем проблемы производительности
• Организуем изолированные тесты в профили
нагрузки по мере добавления функционала
• Непрерывное тестирование производительности
Как тестировать до “начала”?
Нет скрипов, инфраструктуры, приложения
Надо тестировать базовые сценарии
Тестировать на реальном масштабе
Тестировать сценарии отказов
Дизайн меняется на ходу, тесты вместе с ним
Тесты должны гонять себя сами, у
разработчиков хватает работы.
Как тестировать до “начала”?
На чём вы пишите юнит-тесты?
• JUnit - Java
Почему бы не писать нагрузочные также?
• Мы знаем Java
• На Java есть библиотеки для всего
• Никаких переформанс инженеров
тесты пишут разработчики
Вопрос культуры
“Классический” подход
• bash + ssh + анализ логов + Excel / R
• Мало пригоден для повторного использования
• Короткий период полураспада тестов
• Использование незнакомого инструментария
“Монокультурный” подход
• Платформаприложения=платформаавтоматизации
− Приходится изобретать велосипеды, но
+ Решается проблема культурного диссонанса
Нагрузочный тест
Развёртывание
 В распределённой среде
Подготовка данных / разогрев
Сценарий тестирования
 Например,дневнойпрофильнагрузкисотказомузлавкластера
Сбор метрик
 Тестовые события
 Метрики ОС
 Данные профилирования
Подготовка отчёта
Стек инструментов
Nanocloud - https://github.com/gridkit/nanocloud/
 Развертывание / управление распределённой средой
GridBeans – “массивно параллельная” Java
 Оркестрация развертывая и подготовки
 Выполнение сценария
Nimble
 Компоненты: cбор данных, мониторинг и прочее
Отчёты
 Сырой CSV на выходе, решение не найдено
Nanocloud
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;
}
});
}
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
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
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
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
Распределённый
сценарий
Распределённый сценарий
• Простые шаги (реализованные на Java)
• Выполняемые в распределённой системе
согласно сценарию
• Возможность синхронизации шагов
• Обмен данными между шагами
• Нет циклов и условного выполнения
• Fail fast – ошибка любого шага
завершает сценарий
Mockito
@Test
public void test() {
MyList mock = Mockito.mock(MyList.class,
Mockito.RETURNS_DEEP_STUBS);
Mockito.when(mock.get(0).getValue()).thenReturn("v1");
Mockito.when(mock.get(1).getValue()).thenReturn("v2");
Assert.assertEquals(null, mock.get(2).getValue());
Assert.assertEquals("v2", mock.get(1).getValue());
Assert.assertEquals("v1", mock.get(0).getValue());
InOrder io = Mockito.inOrder(mock);
io.verify(mock).get(2);
io.verify(mock).get(1);
io.verify(mock).get(0);
io.verifyNoMoreInteractions();
}
Mockito way
1. Декларация намерений
 Моки и вызовы методов
 “Виртуальное” время
 “Абстрактная” распределённость
2. Физическое выполнение
 Привязка к топологии
 Зависимости между шагами
 Параллельное / распределённое выполнение
Простой пример #1
public void example() {
MonadBuilder bld = MonadFactory.build();
MyReader reader = bld.locator(Cloud.class).at("reader")
.deploy(MyReader.class, ...);
reader.configure("read config");
bld.join("start");
reader.execute();
bld.join("done");
bld.rewind();
MyWriter writer = bld.locator(Cloud.class)
.at("writer").deploy(MyWriter.class, ...);
writer.configure("write config");
bld.join("start");
writer.execute();
bld.join("done");
}
Простой пример #1
deploy
reader
reader
.configure()
start
reader
.execute()
done
deploy
writer
writer
.configure()
writer
.execute()
Простой пример #1
Драйвер
 Интерфейс декларирующий шаги
 Шаги – методы
 Шаг может вернуть “интерфейс”
 Шаги могут принимать параметры
 Сериализуемые объекты
 Результаты выполнения шагов
 Реализация драйвера размещается в
распределённой среде используя локатор
Простой пример #1
public void example() {
MonadBuilder bld = MonadFactory.build();
MyReader reader = bld.locator(Cloud.class).at("reader")
.deploy(MyReader.class, ...);
reader.configure("read config");
bld.join("start");
reader.execute();
bld.join("done");
bld.rewind();
MyWriter writer = bld.locator(Cloud.class).at("writer")
.deploy(MyWriter.class, ...);
writer.configure("write config");
bld.join("start");
writer.execute();
bld.join("done");
}
Локатор
Драйвер прокси
CheckpointCheckpoint
Перемотка времени
Простой пример #1
deploy
reader
reader
.configure()
start
reader
.execute()
done
deploy
writer
writer
.configure()
writer
.execute()
deploy
reader
reader
.configure()
reader
.execute()
deploy
writer
writer
.configure()
writer
.execute()
Простой пример #2
MyReader reader = bld.locator(Cloud.class).at("reader")
.deploy(MyReader.class, ...);
reader.configure("read config");
bld.sync();
Runnable readTask = reader.createTask();
bld.join("start");
ExecutionDriver exec = bld.bean(ExecutionDriver.class);
Activity readJob = exec.execute(readTask);
bld.join("stop");
readJob.stop();
bld.join(readJob);
bld.join("done");
bld.rewind("start");
bld.wallclock().delay(30, TimeUnit.SECONDS);
bld.join("stop");
Простой пример #2
deploy
reader
reader
.configure()
start
wallclock
.delay()
done
reader
.createTask()
exec
.execute()
stop
readTask
readJob
.stop()
readJob
readJob
.join()
Простой пример #2
MyReader reader = bld.locator(Cloud.class).at("reader")
.deploy(MyReader.class, ...);
reader.configure("read config");
bld.sync();
Runnable readTask = reader.createTask();
bld.join("start");
ExecutionDriver exec = bld.bean(ExecutionDriver.class);
Activity readJob = exec.execute(readTask);
bld.join("stop");
readJob.stop();
bld.join(readJob);
bld.join("done");
bld.rewind("start");
bld.wallclock().delay(30, TimeUnit.SECONDS);
bld.join("stop");
Вспомогательный сервис
Интерфейс фоновых задач
Получение сервиса
Простой пример #2
Ошибка выполнение шага отлавливается
и завершает сценарий.
Когда создаётся фоновая задача, используется
Activity.join() шага, который не завершится пока
задача не будет остановлена.
Wallclock – драйвер предоставляемый из коробки.
ExecutionDriver – пример вспомогательного
драйвера.
Распределённый сценарий
Всех аспекты теста –
Развёртывание / Сбор данных / Мониторинг / и т.д.
шаги / драйверы единого сценария
Распределённый сценарий
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.
Вспомогательные
компоненты
Метеринг
Сбор метрик в распределённой среде
 Данные тестовых событий
 Данные мониторинга
Метрики аккумулируются на локальном
диске и передаются на управляющий узел
по завершении сценария
Все результаты экспортируются в CSV файл
большой CSV файл
Мониторинг
Метрики OS - https://github.com/hyperic/sigar
 Network interface stats
 Process stats (поиск нужных процессов)
JVM
 GC
 Threads
 Custom MBeans
Build your own
Профилирование
BTrace 2 - https://github.com/jbachorik/btrace2
 Инструментирующий профайлер
 Точки перехвата на Java
 Развёртывание как часть сценария
 Интеграция с метерингом
Ссылки
NanoCloud
• https://github.com/gridkit/nanocloud/
• https://code.google.com/p/gridkit/wiki/NanoCloudTutorial
• Maven Central: org.gridkit.lab:nanocloud:0.8.10
• http://blog.ragozin.info/2013/01/remote-code-execution-in-java-made.html
GridBeans
• https://github.com/aragozin/gridbeans
Nimble
• https://github.com/gridkit/nimble
Пример бенчмарка
• https://github.com/gridkit/zk-benchmark-example
Thank you
Alexey Ragozin
alexey.ragozin@gmail.com
http://blog.ragozin.info
- my articles
http://www.meetup.com/bigmoscow
- community events in Moscow

More Related Content

PPT
Нагрузочное тестирование
SPB SQA Group
 
PDF
Андрей Похилько — Нагрузочное тестирование типичного интернет сервиса
Yandex
 
PPT
Нагрузочное тестирование web-приложений с помощью Load Runner
SQALab
 
PDF
Performance Test Driven Development (CEE SERC 2013 Moscow)
aragozin
 
PPTX
Нагрузочное тестирование теория Кожухов
Илья Кожухов
 
PDF
Нагрузочное тестирование с помощью Яндекс.Танка
Aleksandr Boichenko
 
PDF
сервис нагрузочного тестирования Ddosme.ru, иван самсонов
Ontico
 
PPTX
Нагрузочное тестирование JMeter Кожухов
Илья Кожухов
 
Нагрузочное тестирование
SPB SQA Group
 
Андрей Похилько — Нагрузочное тестирование типичного интернет сервиса
Yandex
 
Нагрузочное тестирование web-приложений с помощью Load Runner
SQALab
 
Performance Test Driven Development (CEE SERC 2013 Moscow)
aragozin
 
Нагрузочное тестирование теория Кожухов
Илья Кожухов
 
Нагрузочное тестирование с помощью Яндекс.Танка
Aleksandr Boichenko
 
сервис нагрузочного тестирования Ddosme.ru, иван самсонов
Ontico
 
Нагрузочное тестирование JMeter Кожухов
Илья Кожухов
 

What's hot (20)

PDF
Григорий Липин: Автоматизация нагрузочного тестирования
Yandex
 
PPTX
Тестирование отклика Web-интерфейса с JMeter и Selenium
SQALab
 
PPTX
Нагрузочное тестирование. С чего начать?
OdessaQA
 
PPT
Инструментация среды исполнения в арсенале тестировщика
SQALab
 
PPTX
Основы и нюансы параллельного тестрования
bearoff
 
PPTX
Test driven development in net
Alex Tumanoff
 
PDF
Проверка на прочность или нагрузочное тестирование с Jmeter
Aleksey Derkach
 
PDF
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
it-people
 
PPTX
Автоматизация тестирования многопоточности
SQALab
 
PPTX
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
PPTX
Жизнь проекта на production
Nikolay Sivko
 
PDF
Веб-сервер Phantom
yaevents
 
PPTX
Sql server clr integration
Alex Tumanoff
 
PDF
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ontico
 
PPTX
Мастер-класс про организацию службы эксплуатации
Nikolay Sivko
 
PPTX
Silverlight 4, есть ли жизнь на десктопе
Alex Tumanoff
 
PDF
Хорошо поддерживаемое приложение
Nikolay Sivko
 
PPTX
Java Ahead-Of-Time compilation
Nikita Lipsky
 
PPTX
Мониторинг качества работы вашего проекта
Nikolay Sivko
 
PPTX
Monitoring-driven эксплуатация (rootconf2015)
Nikolay Sivko
 
Григорий Липин: Автоматизация нагрузочного тестирования
Yandex
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
SQALab
 
Нагрузочное тестирование. С чего начать?
OdessaQA
 
Инструментация среды исполнения в арсенале тестировщика
SQALab
 
Основы и нюансы параллельного тестрования
bearoff
 
Test driven development in net
Alex Tumanoff
 
Проверка на прочность или нагрузочное тестирование с Jmeter
Aleksey Derkach
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
it-people
 
Автоматизация тестирования многопоточности
SQALab
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
Жизнь проекта на production
Nikolay Sivko
 
Веб-сервер Phantom
yaevents
 
Sql server clr integration
Alex Tumanoff
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ontico
 
Мастер-класс про организацию службы эксплуатации
Nikolay Sivko
 
Silverlight 4, есть ли жизнь на десктопе
Alex Tumanoff
 
Хорошо поддерживаемое приложение
Nikolay Sivko
 
Java Ahead-Of-Time compilation
Nikita Lipsky
 
Мониторинг качества работы вашего проекта
Nikolay Sivko
 
Monitoring-driven эксплуатация (rootconf2015)
Nikolay Sivko
 
Ad

Viewers also liked (14)

DOCX
Chiki 9e
IE Simona Duque
 
PDF
Padi Letter 18 May99
twillson3
 
PPTX
La Tierra Sin Humanos
NeftisLis
 
PDF
Portfolio sample
hodayalouis
 
PDF
Laura.ashley4
kirstalps22
 
PPTX
Unidad 1
itzel1992
 
PDF
2014fwc ticketingfanguide pr_portuguese
laertemelo
 
PPTX
Freeport campo #1
dist159
 
PDF
Ranking mercado asegurador 31 de marzo 2010
CANATAME
 
PDF
Letak01
ELVIS
 
PPTX
Epidemiology
Dr. Poonamjot Kaur Sidhu
 
DOCX
QSEN Paper
Andrea Ritchie
 
PPTX
Tips For Constructing Objective Written Exam Questions
Soha Rashed
 
PDF
Plumbing_work_Laying of sewerage
Konstantin Komarov
 
Chiki 9e
IE Simona Duque
 
Padi Letter 18 May99
twillson3
 
La Tierra Sin Humanos
NeftisLis
 
Portfolio sample
hodayalouis
 
Laura.ashley4
kirstalps22
 
Unidad 1
itzel1992
 
2014fwc ticketingfanguide pr_portuguese
laertemelo
 
Freeport campo #1
dist159
 
Ranking mercado asegurador 31 de marzo 2010
CANATAME
 
Letak01
ELVIS
 
QSEN Paper
Andrea Ritchie
 
Tips For Constructing Objective Written Exam Questions
Soha Rashed
 
Plumbing_work_Laying of sewerage
Konstantin Komarov
 
Ad

More from aragozin (20)

PDF
Java on Linux for devs and ops
aragozin
 
PDF
I know why your Java is slow
aragozin
 
PPTX
Java profiling Do It Yourself (jug.msk.ru 2016)
aragozin
 
PDF
Java black box profiling JUG.EKB 2016
aragozin
 
PDF
What every Java developer should know about network?
aragozin
 
PPTX
Java profiling Do It Yourself
aragozin
 
PPTX
DIY Java Profiler
aragozin
 
PPTX
Java black box profiling
aragozin
 
PDF
Блеск и нищета распределённых кэшей
aragozin
 
PDF
JIT compilation in modern platforms – challenges and solutions
aragozin
 
PDF
Casual mass parallel computing
aragozin
 
PPTX
Nanocloud cloud scale jvm
aragozin
 
PDF
Java GC tuning and monitoring (by Alexander Ashitkin)
aragozin
 
PDF
Garbage collection in JVM
aragozin
 
PDF
Virtualizing Java in Java (jug.ru)
aragozin
 
PDF
Filtering 100M objects in Coherence cache. What can go wrong?
aragozin
 
PDF
Cборка мусора в Java без пауз (HighLoad++ 2013)
aragozin
 
PDF
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
aragozin
 
PDF
Performance Test Driven Development with Oracle Coherence
aragozin
 
PPTX
Борьба с GС паузами в JVM
aragozin
 
Java on Linux for devs and ops
aragozin
 
I know why your Java is slow
aragozin
 
Java profiling Do It Yourself (jug.msk.ru 2016)
aragozin
 
Java black box profiling JUG.EKB 2016
aragozin
 
What every Java developer should know about network?
aragozin
 
Java profiling Do It Yourself
aragozin
 
DIY Java Profiler
aragozin
 
Java black box profiling
aragozin
 
Блеск и нищета распределённых кэшей
aragozin
 
JIT compilation in modern platforms – challenges and solutions
aragozin
 
Casual mass parallel computing
aragozin
 
Nanocloud cloud scale jvm
aragozin
 
Java GC tuning and monitoring (by Alexander Ashitkin)
aragozin
 
Garbage collection in JVM
aragozin
 
Virtualizing Java in Java (jug.ru)
aragozin
 
Filtering 100M objects in Coherence cache. What can go wrong?
aragozin
 
Cборка мусора в Java без пауз (HighLoad++ 2013)
aragozin
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
aragozin
 
Performance Test Driven Development with Oracle Coherence
aragozin
 
Борьба с GС паузами в JVM
aragozin
 

Распределённое нагрузочное тестирование на Java

  • 1. Распределённое нагрузочное тестирование на Java Алексей Рагозин Артём Панасюк jug.msk.ru 2016
  • 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 – ошибка любого шага завершает сценарий
  • 19. Mockito @Test public void test() { MyList mock = Mockito.mock(MyList.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(mock.get(0).getValue()).thenReturn("v1"); Mockito.when(mock.get(1).getValue()).thenReturn("v2"); Assert.assertEquals(null, mock.get(2).getValue()); Assert.assertEquals("v2", mock.get(1).getValue()); Assert.assertEquals("v1", mock.get(0).getValue()); InOrder io = Mockito.inOrder(mock); io.verify(mock).get(2); io.verify(mock).get(1); io.verify(mock).get(0); io.verifyNoMoreInteractions(); }
  • 20. Mockito way 1. Декларация намерений  Моки и вызовы методов  “Виртуальное” время  “Абстрактная” распределённость 2. Физическое выполнение  Привязка к топологии  Зависимости между шагами  Параллельное / распределённое выполнение
  • 21. Простой пример #1 public void example() { MonadBuilder bld = MonadFactory.build(); MyReader reader = bld.locator(Cloud.class).at("reader") .deploy(MyReader.class, ...); reader.configure("read config"); bld.join("start"); reader.execute(); bld.join("done"); bld.rewind(); MyWriter writer = bld.locator(Cloud.class) .at("writer").deploy(MyWriter.class, ...); writer.configure("write config"); bld.join("start"); writer.execute(); bld.join("done"); }
  • 23. Простой пример #1 Драйвер  Интерфейс декларирующий шаги  Шаги – методы  Шаг может вернуть “интерфейс”  Шаги могут принимать параметры  Сериализуемые объекты  Результаты выполнения шагов  Реализация драйвера размещается в распределённой среде используя локатор
  • 24. Простой пример #1 public void example() { MonadBuilder bld = MonadFactory.build(); MyReader reader = bld.locator(Cloud.class).at("reader") .deploy(MyReader.class, ...); reader.configure("read config"); bld.join("start"); reader.execute(); bld.join("done"); bld.rewind(); MyWriter writer = bld.locator(Cloud.class).at("writer") .deploy(MyWriter.class, ...); writer.configure("write config"); bld.join("start"); writer.execute(); bld.join("done"); } Локатор Драйвер прокси CheckpointCheckpoint Перемотка времени
  • 26. Простой пример #2 MyReader reader = bld.locator(Cloud.class).at("reader") .deploy(MyReader.class, ...); reader.configure("read config"); bld.sync(); Runnable readTask = reader.createTask(); bld.join("start"); ExecutionDriver exec = bld.bean(ExecutionDriver.class); Activity readJob = exec.execute(readTask); bld.join("stop"); readJob.stop(); bld.join(readJob); bld.join("done"); bld.rewind("start"); bld.wallclock().delay(30, TimeUnit.SECONDS); bld.join("stop");
  • 28. Простой пример #2 MyReader reader = bld.locator(Cloud.class).at("reader") .deploy(MyReader.class, ...); reader.configure("read config"); bld.sync(); Runnable readTask = reader.createTask(); bld.join("start"); ExecutionDriver exec = bld.bean(ExecutionDriver.class); Activity readJob = exec.execute(readTask); bld.join("stop"); readJob.stop(); bld.join(readJob); bld.join("done"); bld.rewind("start"); bld.wallclock().delay(30, TimeUnit.SECONDS); bld.join("stop"); Вспомогательный сервис Интерфейс фоновых задач Получение сервиса
  • 29. Простой пример #2 Ошибка выполнение шага отлавливается и завершает сценарий. Когда создаётся фоновая задача, используется Activity.join() шага, который не завершится пока задача не будет остановлена. Wallclock – драйвер предоставляемый из коробки. ExecutionDriver – пример вспомогательного драйвера.
  • 30. Распределённый сценарий Всех аспекты теста – Развёртывание / Сбор данных / Мониторинг / и т.д. шаги / драйверы единого сценария
  • 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  Развёртывание как часть сценария  Интеграция с метерингом
  • 36. Ссылки NanoCloud • https://github.com/gridkit/nanocloud/ • https://code.google.com/p/gridkit/wiki/NanoCloudTutorial • Maven Central: org.gridkit.lab:nanocloud:0.8.10 • http://blog.ragozin.info/2013/01/remote-code-execution-in-java-made.html GridBeans • https://github.com/aragozin/gridbeans Nimble • https://github.com/gridkit/nimble Пример бенчмарка • https://github.com/gridkit/zk-benchmark-example
  • 37. Thank you Alexey Ragozin [email protected] http://blog.ragozin.info - my articles http://www.meetup.com/bigmoscow - community events in Moscow