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

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

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

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

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

Подготовка

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

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

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

Компоненты

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

MZBench API serverCLI Cloud

controller

Запуск

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

MZBench API serverCLI Cloud

controllerHTTP Get

Status

Allocate

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

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

MZBench API serverCLI Cloud

controllerStatus

ProvisionProvisionProvision

Работа

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

MZBench API serverCLI Cloud

controller

Director Node

Node

Status

Load

Load

Status

Завершение

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

MZBench API serverCLI Cloud

controllerStatus

Deallocate

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

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

MZBench server

Director

Node

Первые шаги

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

cd ~/mzbench

./bin/mzbench start_server

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

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

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

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

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

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

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

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

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

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

simple_http_worker

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

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

Структура

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

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

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

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

initial_state() -> [].

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

Функции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}.

python_http_worker

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

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

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

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

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

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

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

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

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

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

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

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

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

Базовый сценарий[ {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"} ]} ]}].

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

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

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

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

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

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

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

Скорость

Цель

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

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

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

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

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

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

Практика

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

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

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