Перейти к содержимому
Последнее обновление

Инструмент для тестирования производительности слоя хранения BE

Назначение​

benchmark_tool тестирует производительность слоя хранения BE в Apache Doris (например, segment и page). Он создаёт заданные объекты из входных данных и выполняет тесты производительности с помощью google benchmark.

Сборка​

  1. Убедитесь, что у вас настроено окружение, позволяющее собрать сам Doris. Подробнее см. в разделе Сборка и развёртывание.
  2. Запустите run-be-ut.sh в репозитории Doris.
  3. Собранный исполняемый файл находится по пути ./be/ut_build_ASAN/test/tools/benchmark_tool.

Использование​

Общие параметры​

ПараметрНазначениеПо умолчанию
--operationТип теста. Подробности см. в сценариях ниже.Нет (обязательный параметр)
--column_typeТипы столбцов в схеме таблицы сегмента. Поддерживаются int, char, varchar, string.int,varchar
--rows_numberКоличество строк данных.10000
--iterationsКоличество итераций теста. При значении 0 benchmark выбирает их число автоматически.10
--input_fileПуть к файлу данных при импорте из файла.Нет

Принятые ограничения длины типов:

ТипДлина
char8
varcharМаксимальное значение
stringМаксимальное значение

Правила генерации случайного набора данных:

ТипПравило
intСлучайное значение в диапазоне [1, 1000000]
charСлучайная длина в диапазоне [1, 8], набор символов: прописные и строчные латинские буквы
varcharСлучайная длина в диапазоне [1, 128], набор символов: прописные и строчные латинские буквы
stringСлучайная длина в диапазоне [1, 100000], набор символов: прописные и строчные латинские буквы

Обзор сценариев тестирования​

СценарийКоманда
Тест чтения сегмента со случайным набором данных./benchmark_tool --operation=SegmentScan --column_type=int,varchar --rows_number=10000 --iterations=0
Тест записи сегмента со случайным набором данных./benchmark_tool --operation=SegmentWrite
Тест чтения сегмента с набором данных, импортированным из файла./benchmark_tool --operation=SegmentScanByFile --input_file=./sample.dat
Тест записи сегмента с набором данных, импортированным из файла./benchmark_tool --operation=SegmentWriteByFile --input_file=./sample.dat
Тест словарного кодирования страницы со случайным набором данных./benchmark_tool --operation=BinaryDictPageEncode --rows_number=10000 --iterations=0
Тест словарного декодирования страницы со случайным набором данных./benchmark_tool --operation=BinaryDictPageDecode

Тест чтения сегмента со случайно сгенерированным набором данных​

Сначала записывает файл segment, используя набор данных, а затем измеряет время полного сканирования segment.

./benchmark_tool --operation=SegmentScan --column_type=int,varchar --rows_number=10000 --iterations=0

Тест записи сегмента со случайно сгенерированным набором данных​

Измеряет время добавления набора данных в segment и записи на диск.

./benchmark_tool --operation=SegmentWrite

Тест чтения сегмента с набором данных, импортированным из файла​

./benchmark_tool --operation=SegmentScanByFile --input_file=./sample.dat

input_file задаёт файл с импортируемым набором данных. Первая строка файла определяет схему таблицы, а каждая последующая строка соответствует одной строке данных со столбцами, разделёнными ,:

int,char,varchar
123,hello,world
321,good,bye

Здесь также поддерживаются типы int, char, varchar и string. Обратите внимание: длина данных типа char не должна превышать 8.

Тест записи сегмента с набором данных, импортированным из файла​

./benchmark_tool --operation=SegmentWriteByFile --input_file=./sample.dat

Тест словарного кодирования страницы со случайно сгенерированным набором данных​

./benchmark_tool --operation=BinaryDictPageEncode --rows_number=10000 --iterations=0

Генерирует случайные значения varchar с длиной в диапазоне [1, 8] и измеряет время кодирования.

Тест словарного декодирования страницы со случайно сгенерированным набором данных​

./benchmark_tool --operation=BinaryDictPageDecode

Генерирует случайные значения varchar с длиной в диапазоне [1, 8], кодирует их и измеряет время декодирования.

Пользовательские тесты​

Вы можете тестировать производительность собственных функций. Реализация находится в /be/test/tools/benchmark_tool.cpp.

1. Напишите тестовую функцию​

void custom_run_plus() {
int p = 100000;
int q = 0;
while (p--) {
q++;
if (UNLIKELY(q == 1024)) q = 0;
}
}
void custom_run_mod() {
int p = 100000;
int q = 0;
while (p--) {
q++;
if (q %= 1024) q = 0;
}
}

2. Зарегистрируйте CustomBenchmark​

benchmarks.emplace_back(
new doris::CustomBenchmark("custom_run_plus", 0,
custom_init, custom_run_plus));
benchmarks.emplace_back(
new doris::CustomBenchmark("custom_run_mod", 0,
custom_init, custom_run_mod));

Здесь init выполняет инициализацию перед каждым раундом тестирования (её время не учитывается при измерении). Если требуется инициализировать объекты, реализуйте это в классе, производном от CustomBenchmark.

3. Пример вывода при запуске​

2021-08-30T10:29:35+08:00
Running ./benchmark_tool
Run on (96 X 3100.75 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x48)
L1 Instruction 32 KiB (x48)
L2 Unified 1024 KiB (x48)
L3 Unified 33792 KiB (x2)
Load Average: 0.55, 0.53, 0.39
----------------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------------
custom_run_plus 0.812 ms 0.812 ms 861
custom_run_mod 1.30 ms 1.30 ms 539

Часто задаваемые вопросы​

Вопрос: Не удаётся найти исполняемый файл benchmark_tool?

Сначала запустите run-be-ut.sh, чтобы полностью собрать модульные тесты BE. Исполняемый файл будет создан по пути ./be/ut_build_ASAN/test/tools/benchmark_tool.

Вопрос: Результат пользовательского теста не соответствует ожиданиям?

Убедитесь, что custom_init не содержит логику тестируемой функции, а тело каждой функции custom_run_* достаточно велико, чтобы оптимизатор не исключил её из кода.