aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAidar Samerkhanov <aidarsamer@yandex-team.ru>2022-02-11 13:06:27 +0300
committerAidar Samerkhanov <aidarsamer@yandex-team.ru>2022-02-11 13:06:27 +0300
commite45ccc950cac8ad89412b0a81c55ed4e8b745e46 (patch)
treed15a40c9b27c02e47c6b08c50212679c1b977258
parent97d0a681d1ee69d18453ee1f85ac1efccaae6031 (diff)
downloadydb-e45ccc950cac8ad89412b0a81c55ed4e8b745e46.tar.gz
KIKIMR-13365. Add russian doc for workload cli.
KIKIMR-13365. Add workload cli russian doc. KIKIMR-13365. Fix compilation in actor workload. KIKIMR-13365. Add workload command to YDB cli. ref:40f21cc883e728b38c6c9109958f848ab73c7e4a
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/commands/_includes/index.md1
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/index.md23
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md335
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/commands/workload/index.md1
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/commands/workload/stock.md1
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml6
6 files changed, 367 insertions, 0 deletions
diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/index.md b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/index.md
index b7a16aa444..25e7da2721 100644
--- a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/index.md
+++ b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/index.md
@@ -9,3 +9,4 @@
* [Потоковое чтение таблицы](../../commands/readtable.md).
* [Работа со вторичными индексами](../../commands/operations-index.md).
* [Работа с директориями](../../commands/scheme-mkdir.md).
+* [Нагрузочное тестирование](../../commands/workload.md). \ No newline at end of file
diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/index.md b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/index.md
new file mode 100644
index 0000000000..f2c0a77433
--- /dev/null
+++ b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/index.md
@@ -0,0 +1,23 @@
+# Нагрузочное тестирование
+
+С помощью команды `workload` вы можете запустить различные виды нагрузки для вашей БД.
+
+Общий вид команды:
+
+```bash
+{{ ydb-cli }} [global options...] workload [subcommands...]
+```
+
+* `global options` — [глобальные параметры](../../../commands/global-options.md).
+* `subcommands` — [подкоманды](#subcomands).
+
+Посмотрите описание команды для запуска нагрузки:
+
+```bash
+{{ ydb-cli }} workload --help
+```
+
+## Доступные подкоманды {#subcommands}
+
+В данный момент поддерживаются следующие виды нагрузочных тестов:
+* [Stock](../stock.md) - симулятор склада интернет-магазина. \ No newline at end of file
diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md
new file mode 100644
index 0000000000..43914b3b43
--- /dev/null
+++ b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md
@@ -0,0 +1,335 @@
+# Stock нагрузка
+
+Симулирует работу склада интернет-магазина: создание заказов из нескольких товаров, получение списка заказов по клиенту.
+
+## Виды нагрузки {#workload_types}
+
+Данный нагрузочный тест содержит 5 видов нагрузки:
+* [getCustomerHistory](#getCustomerHistory) - читает заданное количество заказов 10 000-го покупателя. Создается нагрузка на чтение одних и тех же строк из разных потоков.
+* [getRandomCustomerHistory](#getRandomCustomerHistory) - читает заданное количество заказов у случайно выбранного покупателя. Создается нагрузка на чтение из разных потоков.
+* [insertRandomOrder](#insertRandomOrder) - создает случайно сгенерированный заказ. Например, клиент создал заказ из 2 товаров, но еще не оплатил его, поэтому остатки товаров не снижаются. В БД записывается информация о заказе и товарах. Создается нагрузка на запись и чтение (insert перед вставкой проверяет есть ли уже запись).
+* [submitRandomOrder](#submitRandomOrder) - создает и обрабатывает случайно сгенерированный заказ. Например, покупатель создал и оплатил заказ из 2 товаров. В БД записывается информация о заказе, товарах, проверяется их наличие и уменьшаются остатки. Создается смешанная нагрузка.
+* [submitSameOrder](#submitSameOrder) - создает заказы с одним и тем же набором товаров. Например, все покупатели покупают один и тот же набор товаров (только что вышедший телефон и заряжающее устройство). Создается нагрузка в виде конкурентного обновления одних и тех же строк в таблице.
+
+## Инициализация нагрузочного теста
+
+Для начала работы необходимо создать таблицы и заполнить их данными:
+```bash
+{{ ydb-cli }} workload stock init [init options...]
+```
+
+* `init options` — [параметры инициализации](#init_options).
+
+Посмотрите описание команды для запуска нагрузки:
+
+```bash
+{{ ydb-cli }} workload init --help
+```
+
+### Доступные параметры {#init_options}
+
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--products <значение>` | `-p <значение>` | Количество видов товаров. Возможные значения от 1 до 500000. Значение по умолчанию: 100.
+`--quantity <значение>` | `-q <значение>` | Количество каждого вида товара на складе. Значение по умолчанию: 1000.
+`--orders <значение>` | `-o <значение>` | Первоначальное количество заказов в БД. Значение по умолчанию: 100.
+`--min-partitions <значение>` | - | Минимальное количество шардов для таблиц. Значение по умолчанию: 40.
+`--auto-partition <значение>` | - | Включение/выключение автошардирования. Возможные значения: 0 или 1. Значение по умолчанию: 1.
+
+Создаются 3 таблицы со следующими DDL:
+```sql
+CREATE TABLE `stock`(product Utf8, quantity Int64, PRIMARY KEY(product)) WITH (AUTO_PARTITIONING_BY_LOAD = ENABLED, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = <min-partitions>);
+CREATE TABLE `orders`(id Uint64, customer Utf8, created Datetime, processed Datetime, PRIMARY KEY(id), INDEX ix_cust GLOBAL ON (customer, created)) WITH (READ_REPLICAS_SETTINGS = "per_az:1", AUTO_PARTITIONING_BY_LOAD = ENABLED, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = <min-partitions>, UNIFORM_PARTITIONS = <min-partitions>);
+CREATE TABLE `orderLines`(id_order Uint64, product Utf8, quantity Int64, PRIMARY KEY(id_order, product)) WITH (AUTO_PARTITIONING_BY_LOAD = ENABLED, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = <min-partitions>, UNIFORM_PARTITIONS = <min-partitions>);
+```
+
+### Примеры инициализации нагрузки {#init-stock-examples}
+
+Создание БД с 1000 видов товаров, где каждого товара 10 000 штук, нет заказов:
+
+```bash
+{{ ydb-cli }} workload stock init -p 1000 -q 10000 -o 0
+```
+
+Создание БД с 10 видами товаров, где каждого товара 100 штук, есть 10 заказов и минимальное количество шардов 100:
+```bash
+{{ ydb-cli }} workload stock init -p 10 -q 100 -o 10 ----min-partitions 100
+```
+
+## Запуск нагрузочного теста
+
+Для запуска нагрузки необходимо выполнить команду:
+```bash
+{{ ydb-cli }} workload stock run [workload type...] [global workload options...] [specific workload options...]
+```
+В течение теста на экран выводится статистика по нагрузке для каждого временного окна.
+
+* `workload type` — [виды нагрузки](#workload_types).
+* `global workload options` - [общие параметры для всех видов нагрузки](#global_workload_options).
+* `specific workload options` - параметры конкретного вида нагрузки.
+
+Посмотрите описание команды для запуска нагрузки:
+
+```bash
+{{ ydb-cli }} workload run --help
+```
+
+### Общие параметры для всех видов нагрузки {#global_workload_options}
+
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--seconds <значение>` | `-s <значение>` | Продолжительность теста, сек. Значение по умолчанию: 10.
+`--threads <значение>` | `-t <значение>` | Количество параллельных потоков, создающих нагрузку. Значение по умолчанию: 10.
+`--quiet` | - | Выводит только итоговый результат теста.
+`--print-timestamp` | - | Печатать время вместе со статистикой каждого временного окна.
+
+## Нагрузка getCustomerHistory {#getCustomerHistory}
+
+Данный вид нагрузки читает заданное количество заказов 10 000-го покупателя.
+
+YQL Запрос:
+```sql
+DECLARE $cust AS Utf8;
+DECLARE $limit AS UInt32;
+
+SELECT id, customer, created FROM orders view ix_cust
+ WHERE customer = 'Name10000'
+ ORDER BY customer DESC, created DESC
+ LIMIT $limit;
+```
+
+Для запуска данного вида нагрузки необходимо выполнить команду:
+```bash
+{{ ydb-cli }} workload stock run getCustomerHistory [global workload options...] [specific workload options...]
+```
+
+* `global workload options` - [общие параметры для всех видов нагрузки](#global_workload_options).
+* `specific workload options` - [параметры конкретного вида нагрузки](#customer_history_options)
+
+### Параметры для getCustomerHistory {#customer_history_options}
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--limit <значение>` | `-l <значение>` | Необходимое количество заказов. Значение по умолчанию: 10.
+
+## Нагрузка getRandomCustomerHistory {#getRandomCustomerHistory}
+
+Данный вид нагрузки читает заданное количество заказов случайно выбранных покупателей.
+
+YQL Запрос:
+```sql
+DECLARE $cust AS Utf8;
+DECLARE $limit AS UInt32;
+
+SELECT id, customer, created FROM orders view ix_cust
+ WHERE customer = $cust
+ ORDER BY customer DESC, created DESC
+ LIMIT $limit;
+```
+
+Для запуска данного вида нагрузки необходимо выполнить команду:
+```bash
+{{ ydb-cli }} workload stock run getRandomCustomerHistory [global workload options...] [specific workload options...]
+```
+
+* `global workload options` - [общие параметры для всех видов нагрузки](#global_workload_options).
+* `specific workload options` - [параметры конкретного вида нагрузки](#random_customer_history_options)
+
+### Параметры для getRandomCustomerHistory {#random_customer_history_options}
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--limit <значение>` | `-l <значение>` | Необходимое количество заказов. Значение по умолчанию: 10.
+
+## Нагрузка insertRandomOrder {#insertRandomOrder}
+
+Данный вид нагрузки создает случайно сгенерированный заказ. В заказ помещаются несколько различных товаров по 1 штуке. Количество видов товара в заказе генерируется случайно по экспоненциальному распределению.
+
+YQL Запрос:
+```sql
+DECLARE $ido AS UInt64;
+DECLARE $cust AS Utf8;
+DECLARE $lines AS List<Struct<product:Utf8,quantity:Int64>>;
+DECLARE $time AS DateTime;
+
+INSERT INTO `orders`(id, customer, created) VALUES
+ ($ido, $cust, $time);
+UPSERT INTO `orderLines`(id_order, product, quantity)
+ SELECT $ido, product, quantity FROM AS_TABLE( $lines );
+```
+
+Для запуска данного вида нагрузки необходимо выполнить команду:
+```bash
+{{ ydb-cli }} workload stock run insertRandomOrder [global workload options...] [specific workload options...]
+```
+
+* `global workload options` - [общие параметры для всех видов нагрузки](#global_workload_options).
+* `specific workload options` - [параметры конкретного вида нагрузки](#insert_random_order_options)
+
+### Параметры для insertRandomOrder {#insert_random_order_options}
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--products <значение>` | `-p <значение>` | Количество видов товара в тесте. Значение по умолчанию: 100.
+
+## Нагрузка submitRandomOrder {#submitRandomOrder}
+
+Данный вид нагрузки создает случайно сгенерированный заказ и обрабатывает его. В заказ помещаются несколько различных товаров по 1 штуке. Количество видов товара в заказе генерируется случайно по экспоненциальному распределению. Обработка заказа заключается в уменьшении количества заказанных товаров на складе.
+
+YQL Запрос:
+```sql
+DECLARE $ido AS UInt64;
+DECLARE $cust AS Utf8;
+DECLARE $lines AS List<Struct<product:Utf8,quantity:Int64>>;
+DECLARE $time AS DateTime;
+
+INSERT INTO `orders`(id, customer, created) VALUES
+ ($ido, $cust, $time);
+
+UPSERT INTO `orderLines`(id_order, product, quantity)
+ SELECT $ido, product, quantity FROM AS_TABLE( $lines );
+
+$prods = SELECT * FROM orderLines AS p WHERE p.id_order = $ido;
+
+$cnt = SELECT COUNT(*) FROM $prods;
+
+$newq =
+ SELECT
+ p.product AS product,
+ COALESCE(s.quantity, 0) - p.quantity AS quantity
+ FROM $prods AS p
+ LEFT JOIN stock AS s
+ ON s.product = p.product;
+
+$check = SELECT COUNT(*) AS cntd FROM $newq as q WHERE q.quantity >= 0;
+
+UPSERT INTO stock
+ SELECT product, quantity FROM $newq WHERE $check=$cnt;
+
+$upo = SELECT id, $time AS tm FROM orders WHERE id = $ido AND $check = $cnt;
+
+UPSERT INTO orders SELECT id, tm AS processed FROM $upo;
+
+SELECT * FROM $newq AS q WHERE q.quantity < 0
+```
+
+Для запуска данного вида нагрузки необходимо выполнить команду:
+```bash
+{{ ydb-cli }} workload stock run submitRandomOrder [global workload options...] [specific workload options...]
+```
+
+* `global workload options` - [общие параметры для всех видов нагрузки](#global_workload_options).
+* `specific workload options` - [параметры конкретного вида нагрузки](#submit_random_order_options)
+
+### Параметры для submitRandomOrder {#submit_random_order_options}
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--products <значение>` | `-p <значение>` | Количество видов товара в тесте. Значение по умолчанию: 100.
+
+## Нагрузка submitSameOrder {#submitSameOrder}
+
+Данный вид нагрузки создает заказ с одним и тем же набором товаров и обрабатывает его. Обработка заказа заключается в уменьшении количества заказанных товаров на складе.
+
+YQL Запрос:
+```sql
+DECLARE $ido AS UInt64;
+DECLARE $cust AS Utf8;
+DECLARE $lines AS List<Struct<product:Utf8,quantity:Int64>>;
+DECLARE $time AS DateTime;
+
+INSERT INTO `orders`(id, customer, created) VALUES
+ ($ido, $cust, $time);
+
+UPSERT INTO `orderLines`(id_order, product, quantity)
+ SELECT $ido, product, quantity FROM AS_TABLE( $lines );
+
+$prods = SELECT * FROM orderLines AS p WHERE p.id_order = $ido;
+
+$cnt = SELECT COUNT(*) FROM $prods;
+
+$newq =
+ SELECT
+ p.product AS product,
+ COALESCE(s.quantity, 0) - p.quantity AS quantity
+ FROM $prods AS p
+ LEFT JOIN stock AS s
+ ON s.product = p.product;
+
+$check = SELECT COUNT(*) as cntd FROM $newq AS q WHERE q.quantity >= 0;
+
+UPSERT INTO stock
+ SELECT product, quantity FROM $newq WHERE $check=$cnt;
+
+$upo = SELECT id, $time AS tm FROM orders WHERE id = $ido AND $check = $cnt;
+
+UPSERT INTO orders SELECT id, tm AS processed FROM $upo;
+
+SELECT * FROM $newq AS q WHERE q.quantity < 0
+```
+
+Для запуска данного вида нагрузки необходимо выполнить команду:
+```bash
+{{ ydb-cli }} workload stock run submitSameOrder [global workload options...] [specific workload options...]
+```
+
+* `global workload options` - [общие параметры для всех видов нагрузки](#global_workload_options).
+* `specific workload options` - [параметры конкретного вида нагрузки](#submit_same_order_options)
+
+### Параметры для submitSameOrder {#submit_same_order_options}
+Имя параметра | Короткое имя | Описание параметра
+---|---|---
+`--products <значение>` | `-p <значение>` | Количество видов товара в каждом заказе. Значение по умолчанию: 100.
+
+## Примеры запуска нагрузок
+
+* Запуск `insertRandomOrder` нагрузки на 5 секунд в 10 потоков с 1000 видами товаров.
+```bash
+{{ ydb-cli }} workload stock run insertRandomOrder -s 5 -t 10 -p 1000
+```
+Возможный результат:
+```text
+Elapsed Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms)
+1 132 0 0 69 108 132 157
+2 157 0 0 63 88 97 104
+3 156 0 0 62 84 104 120
+4 160 0 0 62 77 90 94
+5 174 0 0 61 77 97 100
+
+Txs Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms)
+779 155.8 0 0 62 89 108 157
+```
+
+* Запуск `submitSameOrder` нагрузки на 5 секунд в 5 потоков с 2 видами товаров в заказе с распечаткой только итоговых результатов.
+```bash
+{{ ydb-cli }} workload stock run submitSameOrder -s 5 -t 5 -p 1000 --quiet
+```
+Возможный результат:
+```text
+Txs Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms)
+16 3.2 67 3 855 1407 1799 1799
+```
+
+* Запуск `getRandomCustomerHistory` нагрузки на 5 секунд в 100 потоков с распечаткой времени каждого временного окна.
+```bash
+{{ ydb-cli }} workload stock run getRandomCustomerHistory -s 5 -t 10 --print-timestamp
+```
+Возможный результат:
+```text
+Elapsed Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms) Timestamp
+1 1046 0 0 7 16 25 50 2022-02-08T17:47:26Z
+2 1070 0 0 7 17 22 28 2022-02-08T17:47:27Z
+3 1041 0 0 7 17 22 28 2022-02-08T17:47:28Z
+4 1045 0 0 7 17 23 31 2022-02-08T17:47:29Z
+5 998 0 0 8 18 23 42 2022-02-08T17:47:30Z
+
+Txs Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms)
+5200 1040 0 0 8 17 23 50
+```
+
+## Интерпретация результатов
+* `Elapsed` - номер временного окна. По умолчанию временное окно равно 1 секунде.
+* `Txs/sec` - количество успешных транзакций нагрузки во временном окне.
+* `Retries` - количество повторных попыток исполнения транзакции клиентом во временном окне.
+* `Errors` - количество ошибок, случившихся во временном окне.
+* `p50(ms)` - 50-й перцентиль latency запросов в мс.
+* `p95(ms)` - 95-й перцентиль latency запросов в мс.
+* `p99(ms)` - 99-й перцентиль latency запросов в мс.
+* `pMax(ms)` - 100-й перцентиль latency запросов в мс.
+* `Timestamp` - временная метка конца временного окна. \ No newline at end of file
diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/workload/index.md b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/index.md
new file mode 100644
index 0000000000..12643df073
--- /dev/null
+++ b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/index.md
@@ -0,0 +1 @@
+{% include [index.md](_includes/index.md) %}
diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/workload/stock.md b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/stock.md
new file mode 100644
index 0000000000..906d59ba44
--- /dev/null
+++ b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/stock.md
@@ -0,0 +1 @@
+{% include [stock.md](_includes/stock.md) %}
diff --git a/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml b/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml
index c6154bf63b..43d886e54a 100644
--- a/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml
+++ b/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml
@@ -41,5 +41,11 @@ items:
include: { mode: link, path: profile/toc_p.yaml }
- name: Получение списка эндпоинтов для базы данных
href: commands/discovery-list.md
+ - name: Нагрузочное тестирование
+ items:
+ - name: Обзор
+ href: commands/workload/index.md
+ - name: Stock нагрузка
+ href: commands/workload/stock.md