mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
update README
This commit is contained in:
parent
ef5d8b4f37
commit
06087b3bf0
@ -1 +1,317 @@
|
|||||||
Keeper Bench
|
# Keeper Bench
|
||||||
|
|
||||||
|
Keeper Bench is a tool for benchmarking Keeper or any ZooKeeper compatible systems.
|
||||||
|
|
||||||
|
To run it call following command from the build folder:
|
||||||
|
|
||||||
|
```
|
||||||
|
./utils/keeper-bench --config benchmark_config_file.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration file
|
||||||
|
|
||||||
|
Keeper Bench runs need to be configured inside a yaml or XML file.
|
||||||
|
An example of a configuration file can be found in `./utils/keeper-bench/example.yaml`
|
||||||
|
|
||||||
|
### Table of contents
|
||||||
|
- [Special Types](#special-types)
|
||||||
|
- [General settings](#general-settings)
|
||||||
|
- [Connections](#connections)
|
||||||
|
- [Generator](#generator)
|
||||||
|
- [Output](#output)
|
||||||
|
|
||||||
|
<a name="special-types"></a>
|
||||||
|
## Special types
|
||||||
|
|
||||||
|
### IntegerGetter
|
||||||
|
|
||||||
|
Can be defined with constant integer or as a random value from a range.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
key: integer
|
||||||
|
key:
|
||||||
|
min_value: integer
|
||||||
|
max_value: integer
|
||||||
|
```
|
||||||
|
|
||||||
|
Example for a constant value:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
some_key: 2
|
||||||
|
```
|
||||||
|
|
||||||
|
Example for random value from [10, 20]:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
some_key:
|
||||||
|
min_value: 10
|
||||||
|
max_value: 20
|
||||||
|
```
|
||||||
|
|
||||||
|
### StringGetter
|
||||||
|
|
||||||
|
Can be defined with constant string or as a random string of some size.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
key: string
|
||||||
|
key:
|
||||||
|
random_string:
|
||||||
|
size: IntegerGetter
|
||||||
|
```
|
||||||
|
|
||||||
|
Example for a constant value:
|
||||||
|
```yaml
|
||||||
|
some_key: "string"
|
||||||
|
```
|
||||||
|
|
||||||
|
Example for a random string with a random size from [10, 20]:
|
||||||
|
```yaml
|
||||||
|
some_key:
|
||||||
|
random_string:
|
||||||
|
size:
|
||||||
|
min_value: 10
|
||||||
|
max_value: 20
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### PathGetter
|
||||||
|
|
||||||
|
If a section contains one or more `path` keys, all `path` keys are collected into a list. \
|
||||||
|
Additionally, paths can be defined with key `children_of` which will add all children of some path to the list.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
path: string
|
||||||
|
path:
|
||||||
|
children_of: string
|
||||||
|
```
|
||||||
|
|
||||||
|
Example for defining list of paths (`/path1`, `/path2` and children of `/path3`):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
main:
|
||||||
|
path:
|
||||||
|
- "/path1"
|
||||||
|
- "/path2"
|
||||||
|
path:
|
||||||
|
children_of: "/path3"
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="general-settings"></a>
|
||||||
|
## General settings
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# number of parallel queries (default: 1)
|
||||||
|
concurrency: integer
|
||||||
|
|
||||||
|
# amount of queries to be executed, set 0 to disable limit (default: 0)
|
||||||
|
iterations: integer
|
||||||
|
|
||||||
|
# delay between intermediate reports in seconds, set 0 to disable reports (default: 1.0)
|
||||||
|
report_delay: double
|
||||||
|
|
||||||
|
# stop launch of queries after specified time limit, set 0 to disable limit (default: 0)
|
||||||
|
timelimit: double
|
||||||
|
|
||||||
|
# continue testing even if a query fails (default: false)
|
||||||
|
continue_on_errors: boolean
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="connections"></a>
|
||||||
|
## Connections
|
||||||
|
|
||||||
|
Connection definitions that will be used throughout tests defined under `connections` key.
|
||||||
|
|
||||||
|
Following configurations can be defined under `connections` key or for each specific connection. \
|
||||||
|
If it's defined under `connections` key, it will be used by default unless a specific connection overrides it.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
secure: boolean
|
||||||
|
operation_timeout_ms: integer
|
||||||
|
session_timeout_ms: integer
|
||||||
|
connection_timeout_ms: integer
|
||||||
|
```
|
||||||
|
|
||||||
|
Specific configuration can be defined with a string or with a detailed description.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
host: string
|
||||||
|
connection:
|
||||||
|
host: string
|
||||||
|
|
||||||
|
# number of sessions to create for host
|
||||||
|
sessions: integer
|
||||||
|
# any connection configuration defined above
|
||||||
|
```
|
||||||
|
|
||||||
|
Example definition of 3 connections in total, 1 to `localhost:9181` and 2 to `localhost:9182` both will use secure connections:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
connections:
|
||||||
|
secure: true
|
||||||
|
|
||||||
|
host: "localhost:9181"
|
||||||
|
connection:
|
||||||
|
host: "localhost:9182"
|
||||||
|
sessions: 2
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="generator"></a>
|
||||||
|
## Generator
|
||||||
|
|
||||||
|
Main part of the benchmark is the generator itself which creates necessary nodes and defines how the requests will be generated. \
|
||||||
|
It is defined under `generator` key.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
Setup defines nodes that are needed for test, defined under `setup` key.
|
||||||
|
|
||||||
|
Each node is defined with a `node` key in the following format:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
node: StringGetter
|
||||||
|
|
||||||
|
node:
|
||||||
|
name: StringGetter
|
||||||
|
data: StringGetter
|
||||||
|
repeat: integer
|
||||||
|
node: Node
|
||||||
|
```
|
||||||
|
|
||||||
|
If only string is defined, a node with that name will be created. \
|
||||||
|
Otherwise more detailed definition could be included to set data or the children of the node. \
|
||||||
|
If `repeat` key is set, the node definition will be used multiple times. For a `repeat` key to be valid, the name of the node needs to be a random string.
|
||||||
|
|
||||||
|
Example for a setup:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
generator:
|
||||||
|
setup:
|
||||||
|
node: "node1"
|
||||||
|
node:
|
||||||
|
name:
|
||||||
|
random_string:
|
||||||
|
size: 20
|
||||||
|
data: "somedata"
|
||||||
|
repeat: 4
|
||||||
|
node:
|
||||||
|
name:
|
||||||
|
random_string:
|
||||||
|
size: 10
|
||||||
|
repeat: 2
|
||||||
|
```
|
||||||
|
|
||||||
|
We will create node `/node1` with no data and 4 children of random name of size 20 and data set to `somedata`. \
|
||||||
|
We will also create 2 nodes with no data and random name of size 10 under `/` node.
|
||||||
|
|
||||||
|
### Requests
|
||||||
|
|
||||||
|
While benchmark is running, we are generating requests.
|
||||||
|
|
||||||
|
Request generator is defined under `requests` key. \
|
||||||
|
For each request `weight` (default: 1) can be defined which defines preference for a certain request.
|
||||||
|
|
||||||
|
#### `create`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
create:
|
||||||
|
# parent path for created nodes
|
||||||
|
path: string
|
||||||
|
|
||||||
|
# length of the name for the create node (default: 5)
|
||||||
|
name_length: IntegerGetter
|
||||||
|
|
||||||
|
# data for create nodes (default: "")
|
||||||
|
data: StringGetter
|
||||||
|
|
||||||
|
# value in range [0.0, 1.0> denoting how often a remove request should be generated compared to create request (default: 0)
|
||||||
|
remove_factor: double
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `set`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
set:
|
||||||
|
# paths on which we randomly set data
|
||||||
|
path: PathGetter
|
||||||
|
|
||||||
|
# data to set
|
||||||
|
data: StringGetter
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `get`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
get:
|
||||||
|
# paths for which we randomly get data
|
||||||
|
path: PathGetter
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `list`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
list:
|
||||||
|
# paths for which we randomly do list request
|
||||||
|
path: PathGetter
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `multi`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
multi:
|
||||||
|
# any request definition defined above can be added
|
||||||
|
|
||||||
|
# optional size for the multi request
|
||||||
|
size: IntegerGetter
|
||||||
|
```
|
||||||
|
|
||||||
|
Multi request definition can contain any other request generator definitions described above. \
|
||||||
|
If `size` key is defined, we will randomly pick `size` amount of requests from defined request generators. \
|
||||||
|
All request generators can have a higher pick probability by using `weight` key. \
|
||||||
|
If `size` is not defined, multi request with same request generators will always be generated. \
|
||||||
|
Both write and read multi requests are supported.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
generator:
|
||||||
|
requests:
|
||||||
|
create:
|
||||||
|
path: "/test_create"
|
||||||
|
name_length:
|
||||||
|
min_value: 10
|
||||||
|
max_value: 20
|
||||||
|
multi:
|
||||||
|
weight: 20
|
||||||
|
size: 10
|
||||||
|
get:
|
||||||
|
path:
|
||||||
|
children_of: "/test_get1"
|
||||||
|
get:
|
||||||
|
weight: 2
|
||||||
|
path:
|
||||||
|
children_of: "/test_get2"
|
||||||
|
```
|
||||||
|
|
||||||
|
We defined a request geneator that will generate either a `create` or a `multi` request. \
|
||||||
|
Each `create` request will create a node under `/test_create` with a randomly generated name with size from range `[10, 20]`. \
|
||||||
|
`multi` request will be generated 20 times more than `create` request. \
|
||||||
|
`multi` request will contain 10 requests and approximately twice as much get requests to children of "/test_get2".
|
||||||
|
|
||||||
|
<a name="output"></a>
|
||||||
|
## Output
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
output:
|
||||||
|
# if defined, JSON output of results will be stored at the defined path
|
||||||
|
file: string
|
||||||
|
# or
|
||||||
|
file:
|
||||||
|
# if defined, JSON output of results will be stored at the defined path
|
||||||
|
path: string
|
||||||
|
|
||||||
|
# if set to true, timestamp will be appended to the output file name (default: false)
|
||||||
|
with_timestamp: boolean
|
||||||
|
|
||||||
|
# if set to true, output will be printed to stdout also (default: false)
|
||||||
|
stdout: boolean
|
||||||
|
```
|
||||||
|
@ -329,7 +329,7 @@ void Runner::runBenchmark()
|
|||||||
generator->startup(*connections[0]);
|
generator->startup(*connections[0]);
|
||||||
std::cerr << "Prepared\n";
|
std::cerr << "Prepared\n";
|
||||||
|
|
||||||
auto start_timestamp_ms = Poco::Timestamp{}.epochMicroseconds() / 1000;
|
auto start_timestamp_ms = Poco::Timestamp().epochMicroseconds() / 1000;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user