Files
nosqlbench/engine-docs/src/main/resources/docs-for-nb/showcase/advanced_testing.md

79 lines
4.0 KiB
Markdown
Raw Normal View History

2020-03-17 11:36:33 -05:00
---
title: Advanced Testing
weight: 13
---
2020-03-23 13:05:35 -05:00
# Advanced Testing
2020-03-17 11:36:33 -05:00
:::info
Some of the features discussed here are only for advanced testing scenarios.
:::
## Hybrid Rate Limiting
2020-03-26 12:33:46 -05:00
Rate limiting is a complicated endeavor, if you want to do it well. The basic rub is that going fast means you have to
be less accurate, and vice-versa. As such, rate limiting is a parasitic drain on any system. The act of rate limiting is
in and of itself poses a limit to the maximum rate, regardless of the settings you pick, because this forces your system
to interact with some hardware notion of time passing, and this takes CPU cycles that could be going to the thing you
are limiting.
This means that in practice, rate limiters are often very featureless. It's daunting enough to need rate limiting, and
asking for anything more than that is often wishful thinking. Not so in NoSQLBench.
The rate limiter in NoSQLBench provides a comparable degree of performance and accuracy to others found in the Java
ecosystem, but it *also* has advanced features:
2020-03-17 11:36:33 -05:00
- Allows a sliding scale between average rate limiting and strict rate limiting.
- Internally accumulates delay time, for C.O. friendly metrics
- It is resettable and reconfigurable on the fly
- It provides its configured values in addition to performance data in metrics
## Flexible Error Handling
2020-03-26 12:33:46 -05:00
An emergent facility in NoSQLBench is the way that error are handled within an activity. For example, with the CQL
activity type, you are able to route error handling for any of the known exception types. You can count errors, you can
log them. You can cause errored operations to auto-retry if possible, up to a configurable number of tries.
2020-03-17 11:36:33 -05:00
2020-03-26 12:33:46 -05:00
This means, that as a user, you get to decide what your test is about. Is it about measuring some nominal but
anticipated level of errors due to intentional over-saturation? If so, then count the errors, and look at their
histogram data for timing details within the available timeout.
2020-03-17 11:36:33 -05:00
2020-03-26 12:33:46 -05:00
Are you doing a basic stability test, where you want the test to error out for even the slightest error? You can
configure for that if you need.
2020-03-17 11:36:33 -05:00
## Cycle Logging
2020-03-26 12:33:46 -05:00
It is possible to record the result status of each and every cycles in a NoSQLBench test run. If the results are mostly
homogeneous, the RLE encoding of the results will reduce the output file down to a small fraction of the number of
cycles. The errors are mapped to ordinals, and these ordinals are stored into a direct RLE-encoded log file. For most
testing where most of the result are simply success, this file will be tiny. You can also convert the cycle log into
textual form for other testing and post-processing and vice-versa.
2020-03-17 11:36:33 -05:00
## Op Sequencing
2020-03-26 12:33:46 -05:00
The way that operations are planned for execution in NoSQLBench is based on a stable ordering that is configurable. The
statement forms are mixed together based on their relative ratios. The three schemes currently supported are round-robin
with exhaustion (bucket), duplicate in order (concat), and a way to spread each statement out over the unit interval
(interval). These account for most configuration scenarios without users having to micro-manage their statement
templates.
2020-03-17 11:36:33 -05:00
## Sync and Async
2020-03-26 12:33:46 -05:00
There are two distinct usage modes in NoSQLBench when it comes to operation dispatch and thread management:
2020-03-17 11:36:33 -05:00
### Sync
2020-03-26 12:33:46 -05:00
Sync is the default form. In this mode, each thread reads its sequence and dispatches one statement at a time, holding
only one operation in flight per thread. This is the mode you often use when you want to emulate an application's
request-per-thread model, as it implicitly linearizes the order of operations within the computed sequence of
statements.
2020-03-17 11:36:33 -05:00
### Async
2020-03-26 12:33:46 -05:00
In Async mode, each thread in an activity is reponsible for juggling a number of operations in-flight. This allows a
NoSQLBench client to juggle an arbitrarily high number of connections, limited primarily by how much memory you have.
2020-03-17 11:36:33 -05:00
2020-03-26 12:33:46 -05:00
Internally, the Sync and Async modes have different code paths. It is possible for an activity type to support one or
both of these.