Блог компании Pravo.ru
3 сентября 2010

Бенчмаркинг при помощи Basho Bench

Ребята из Basho team в дополнение к своей NoSQL-базе Riak и утилите для сборки rebar сделали еще одну полезную вещь — Basho Bench, утилиту для бенчмаркинга.

Изначально Basho Bench позиционировалась как утилита для тестирования производительности key-value-хранилищ, но в ходе его развития как-то само собой оказалось, что тестировать с ее помощью можно и другие приложения.

Быстрый старт.

Основной репозиторий Basho использует в качестве системы контроля версий Mercurial, но, так как мне привычнее GIT, я использую их репозиторий на Github'е:

git clone git://github.com/basho/basho_bench.git
cd basho_bench
make all rel

Для проведения теста на производительность достаточно написать файл конфигурации теста, натравить на него Erlang'овский бинарник basho_bench и, дождавшись окончания тестов и выполнив команду make results, проанализировать графики получившегося безобразия:

./basho_bench my_config.conf && make results

(Картинка кликабельна)
image


В файле конфигурации подключается драйвер, написанный на Erlang (небольшая, в стоню-полторы строк кода надстройка над нужной клиентской библиотекой), устанавливается число потоков, выполняющих нужные действия, число операций в секунду и настраиваются генераторы данных для тестирования.

Вот пример типичного файла настроек:

{mode, max}.
{duration, 15}.
{concurrent, 10}.
{operations, [{get, 1000}, {put, 10}, {delete, 1}]}.

{driver, Basho Bench_driver_riakclient}.
{code_paths, [«deps/stats»,
"/home/ubuntu/riak/apps/riak_kv",
"/home/ubuntu/riak/apps/riak_core"]}.

{key_generator, {sequential_int_bin, 35000000}}.
{value_generator, {exponential_bin, 256, 10240}}.

{riakclient_nodes, ['riak@10.242.78.144']}.
{riakclient_mynode, ['Basho Bench@10.242.78.144', longnames]}.
{riakclient_replies, 1}.

Список драйверов, правда, невелик: три хранилища для Riak (т.е., тестируется производительность хранилища на локальной машине, без распределенности, консистентности, и т.п. — только низкоуровневые операции) и три протокола для самой базы данных Riak (здесь уже будет все вышеперечисленное). Впрочем, покопавшись на Github'е, можно найти еще несколько готовых решений. Наконец, если нужного вам драйвера не нашлось и там — написать свой на базе, скажем, готового клиента к исследуемой базе данных будет очень просто.

Немного личного опыта.

Очень здорово Basho Bench помогает при хакинге и оптимизации какого-либо продукта. Скажем, вы видите какую-то некрасивую/медленную/неправильную конструкцию, которую можете переписать тремя способами. Какой из них лучше и эффективнее — навскидку сказать сложно. Можно протестировать все, поставив на 5-10 минут прогон через Basho Bench для каждого варианта. В результатах будет выдана базовая статистика: среднее время на одну операцию с течением времени теста, а также данные по каждому типу операций отдельно: среднеквадратичное, среднее арифметическое и процентили (все величины тоже в зависимости от времени).

Так, проводя тесты Riak на инстансах Amazone EC2, за счет Basho Bench я смогла сэкономить кучу времени, попробовав много разных сочетаний конфигураций кластера, Riak'а и самих инстансов. При этом, данные в тестах были максимально приближены к боевым условиям, и нагрузка создавалась максимальная.
Также было проведено несколько тестов MongoDB самописным драйвером на базе библиотеки emongo, на написание коего ушло примерно полчаса-час. В скором будущем планирую законтрибьютить Basho этот драйвер, а заодно и драйвер для MySQL на базе самописного клиента.

Само собой, возможности Basho Bench не ограничиваются одними базами данных. Можно тестировать фактически все: веб-сервера, парсеры, вычислители, и т.п. Небольшой набор начальных фич компенсируется удобной архитектурой. Любой компонент легко расширить. Не подходят под задачу имеющиеся генераторы ключей или значений? Написать новый можно буквально за несколько минут. Хотите вкупе с типом операции передавать дополнительные параметры? Пара часов работы — и можно вписывать нужные MySQL-запросы прямо в конфиг, не влезая в Erlang-код.

Ложка дегтя.

Само собой, и у Basho Bench есть недостатки. Главный из них — это R, требуемый для генерации графиков. При всей своей потенциальной мощности, он сложен и часто требует танцев с бубнов при установке и настройке.

А настраивать хочется. Например, если проверяется не 2-3 операции, а десяток, хочется рационально разместить графики на картинке. Не говоря уж о дефолтном разрешении — 1024x768. Кроме того, порой R весьма недальновидно отрисовывает сами кривые, преступно оставляя много свободного места на графике.

Впрочем, можно использовать свой генератор графиков: все данные о тестах хранятся в обычных CSV-файлах. Или доработать напильником скрипты генерации графиков, если знаете R.

Еще один своего рода недостаток, хотя и спорный, — для активного использования очень желательно знать Erlang, хотя бы по верхам. С другой стороны, активный контрибьютинг эту надобность более или менее устранит.

Вместо эпилога.

Всем, кто много тестирует базы данных на производительность — настоятельно рекоммендуется. Дважды рекоммендуется людям, знающим и использующим Erlang: можно элементарно тестировать любые компоненты своей системы.

А главное — экономия кучи времени и сил, применимых для решения новых, еще более интересных и сложных задач.

Успешных бенчмарков!
+18
3,3k 15
Комментарии 2
Популярное за сутки