Нагрузочное
тестирование с MZBench
Вадим Литвинов,
MachineZone
Подготовка
Скачайте образ VirtualBox
Логин: root Пароль: нету
Архитектура
MZBench
Компоненты
Тестируемая
система
MZBench
API server
CLI
Cloud
controller
Запуск
Тестируемая
система
MZBench
API server
CLI
Cloud
controller
HTTP Get
Status
Allocate
Провизионинг
Тестируемая
система
MZBench
API server
CLI
Cloud
controllerStatus
Provision
Provision
Provision
Работа
Тестируемая
система
MZBench
API server
CLI
Cloud
controller
Director Node
Node
Status
Load
Load
Status
Завершение
Тестируемая
система
MZBench
API server
CLI
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 init
git add —all
git commit -m «Initial commit»
Пишем сами!
Задача: Написать HTTP воркера на Python
Как сделать HTTP реквест:
import requests
r = requests.get(«url»)
r.status_code == 200
Как посчитать время:
import time
start = 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>} - возвращает
случайный элемент из списка
Бонус: Поиграть со скоростью

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