2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
Transcript of 2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
Провизионинг
Тестируемая система
MZBench API serverCLI Cloud
controllerStatus
ProvisionProvisionProvision
Работа
Тестируемая система
MZBench API serverCLI Cloud
controller
Director Node
Node
Status
Load
Load
Status
Локальный запуск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»} ] }]}].
Метрики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>}