Top Banner
Нагрузочное тестирование с MZBench Вадим Литвинов, MachineZone
31

2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Apr 14, 2017

Download

Software

HappyDev
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Нагрузочное тестирование с MZBench

Вадим Литвинов, MachineZone

Page 2: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Подготовка

Скачайте образ VirtualBox

Логин: root Пароль: нету

Page 3: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Архитектура MZBench

Page 4: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Компоненты

Тестируемая система

MZBench API serverCLI Cloud

controller

Page 5: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Запуск

Тестируемая система

MZBench API serverCLI Cloud

controllerHTTP Get

Status

Allocate

Page 6: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Провизионинг

Тестируемая система

MZBench API serverCLI Cloud

controllerStatus

ProvisionProvisionProvision

Page 7: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Работа

Тестируемая система

MZBench API serverCLI Cloud

controller

Director Node

Node

Status

Load

Load

Status

Page 8: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Завершение

Тестируемая система

MZBench API serverCLI Cloud

controllerStatus

Deallocate

Page 9: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Локальный запускCloud controller: dummycloud_plugin

Все компоненты на одной машине:

MZBench server

Director

Node

Page 10: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Первые шаги

Page 11: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Запуск сервера

cd ~/mzbench

./bin/mzbench start_server

Зайдите на http://localhost:4800

Page 12: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Запуск сценария

./bin/mzbench start ./examples/ramp.erl

Можно так-же использовать кнопку «New» в dashboard

Page 13: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Компоненты бенчаБенчмарк состоит из двух компонентов:

worker - Набор функций для доступа к трестируемому сервису

сценарий - описывает конкретный бенчмарк

Page 14: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

СценарийСценарий описывается Erlang-подобным языком:

[{pool, [ {size, 3}, {worker_type, dummy_worker} ], [ {loop, [{time, {5, min}}, {rate, {1, rps}}], [ {print, «Foo»} ] }]}].

Page 15: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Пишем воркера

Page 16: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

simple_http_worker

Рассмотрим файл:

~/mzbench/workers/simple_http/src/simple_http_worker.erl

Page 17: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Структура

initial_state() - начальное состояние

metrics() - Объявление метрик

Функции воркера

Page 18: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Начальное состояние

initial_state() -> [].

Page 19: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Метрикиmetrics() -> [ [ {"http_ok", counter}, {"http_fail", counter}, {"other_fail", counter} ], {"latency", histogram} ].

Page 20: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Функцииget(State, _Meta, URL) -> StartTime = os:timestamp(), Response = hackney:request(get, list_to_binary(URL), [], <<"">>, []),

case Response of {ok, _, _, BodyRef} -> hackney:skip_body(BodyRef); _ -> ok end,

Latency = timer:now_diff(os:timestamp(), StartTime), mzb_metrics:notify({"latency", histogram}, Latency),

case Response of {ok, 200, _, _} -> mzb_metrics:notify({"http_ok", counter}, 1); {ok, _, _, _} = Reply -> lager:error("GET failed: ~p", [Reply]), mzb_metrics:notify({"http_fail", counter}, 1); E -> lager:error("hackney:request failed: ~p", [E]), mzb_metrics:notify({"other_fail", counter}, 1) end, {nil, State}.

Page 21: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

python_http_worker

Листинг доступных шаблонов: ~/mzbench/bin/mzbench list_templates

Создание нового воркера: ~/mzbench/bin/mzbench new_worker --template=python_empty python_http

Page 22: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

python_http_workerВалидация сценария:

~/mzbench/bin/mzbench validate examples/python_http.erl

Локальный запуск: ~/mzbench/bin/mzbench run_local examples/python_http.erl

Page 23: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

python_http_workerВ начале examples/python_http.erl:

{make_install, [{git, «/root/python_http»}]},

Создаем репозитарий: git initgit add —allgit commit -m «Initial commit»

Page 24: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Пишем сами!Задача: Написать HTTP воркера на Python

Как сделать HTTP реквест: import requestsr = requests.get(«url»)r.status_code == 200

Как посчитать время: import timestart = time.clock()time.clock() - start

Бонус: Выставлять URL отдельной функцией

Page 25: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Пишем сценарии

Page 26: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Базовый сценарий[ {make_install, [{git, «/root/python_http"}]}, {pool, [ {size, 3}, {worker_type, python_http, python} ], [ {loop, [ {time, {3, min}}, {rate, {1, rps}} ], [ {get, "http://localhost:4800"} ]} ]}].

Page 27: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Параметризация

{var, <Name> [, <DefValue>]} - строковая переменная;

{numvar, <Name> [, <DefValue>]} - численная переменная;

Использование: mzbench start --env <Name> = <Value>

Page 28: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

ПрактикаЗамените параметрами:

Количество воркеров

Длительность сценария

Скорость

Цель

Бонус: Поиграйтесь с mzbench change_env

Page 29: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

ЦиклыСкорость не обязана быть константной:

{ramp, linear, <Start>, <Stop>} - Линейное изменение от <Start> до <Stop> {comb, <Rate1>, <Time1>, <Rate2>, <Time2>} - Скорость <Rate1> в течении <Time1>, потом скорость <Time2> и т.д.

Page 30: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

РесурсыВнешний файл (например json): [«url1», «url2», «url3»]

Импортируем в сценарий: {include_resource, <Name>, «<File>», json}

Используем: {resource, <Name>}

Page 31: 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench

Практика

Отправлять запросы по случайному URL из списка:

{choose, <List>} - возвращает случайный элемент из списка

Бонус: Поиграть со скоростью