diff --git a/docs/development/benchmarking.md b/docs/development/benchmarking.md new file mode 100644 index 00000000..631c1fec --- /dev/null +++ b/docs/development/benchmarking.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 3 +--- + +# Benchmarking + +Do you have an existing Redis environment and would like to see if Dragonfly could be a better +replacement?
+Are you developing a service and would like to determine which cloud instance type to +allocate for Dragonfly?
+Do you wonder how many replicas you need to support your workload? + +If so, read on, because this page is for you! + +## Squeezing the Best Performance + +A benchmark is done to assess the performance aspects of a system. In the case of Dragonfly, a +benchmark is commonly used to assess the CPU and memory performance & utilization. + +Depending on the goals of your benchmark, you should choose the machine size accordingly. For a +production mimicking benchmark, you should use a machine size and traffic load similar to that of +your busiest production timing, or even higher to allow for some cushion. + +### `io_uring` + +Dragonfly supports both `epoll` and [`io_uring`](https://en.wikipedia.org/wiki/Io_uring) Linux APIs. +`io_uring` is a newer API, which is faster. Dragonfly runs best with `io_uring`, but it is only +available with Linux kernels >= 5.1. + +`io_uring` is available in Debian versions Bullseye (11) or later, Ubuntu 21.04 or later, Red Hat +Enterprise Linux 9.3 or later, Fedora 37 or later. + +To find if your machine has `io_uring` support you could run the following: + +```shell +grep io_uring_setup /proc/kallsyms +``` + +### Choosing Instance Type + +Cloud providers, such as Amazon AWS, provide different types and sizes of virtual machines. When in +doubt, you could always opt in for a bigger instance (for both Dragonfly and the client to send the +benchmarking traffic) so that you'll know what the upper limit is. + +### Choosing Thread Count + +By default, Dragonfly will create a thread for each available CPU on the machine. You can modify +this behavior with the `--proactor_threads` flag. Generally you should not use this flag for a +machine dedicated to running Dragonfly. You can specify a lower number if you only want Dragonfly to +utilize some of the machine, but don't specify a higher number (i.e. more than CPUs) as it would +degrade performance. + +## Setting Up Dragonfly + +Dragonfly can run in [Docker](/getting-started/docker) or directly installed as a +[binary](/getting-started/binary) on your machine. See the [Getting Started](/getting-started) page +for other options and the latest documentation. + +## Reducing Noise + +Ideally, a benchmark should be run in as similar as possible environment as the production setup. + +In busy production deployments, it is common to run Dragonfly in its own machine (virtual or +dedicated). If you plan to do so in your production setup as well (which we highly recommend), +consider running the benchmark in a similar way. + +In practice, it means that any other systems in your setup (like other services & databases) should +run in other machines. Importantly, also **the software that sends the traffic should run in another +machine.** + +## Sending Traffic + +If your service already has existing benchmarking tools, or ways to record and replay production +traffic, you should definitely use them. That would be the closest estimation to what a real +production deployment with a backing Dragonfly would look like. + +If, like many others, you do not (yet) have such a tool, you could either write your own tool to +simulate production traffic or use an existing tool like `memtier_benchmark`. + +When writing your own tool, try to recreate the production traffic as closely as possible. Use the +same commands (like `SET`, `GET`, `SADD`, etc), with the expected ratio between them, and the +expected key and value sizes. + +If you choose to use an existing benchmarking tool, a popular and mature one is +[`memtier_benchmark`](https://github.com/RedisLabs/memtier_benchmark). It's an Open Source tool for +generic load generation and benchmarking with many features. We use it for benchmarking constantly. +Check out their [documentation +page](https://redis.com/blog/memtier_benchmark-a-high-throughput-benchmarking-tool-for-redis-memcached/) +for more details, but as a quick reference you could use: + +```shell +memtier_benchmark \ + --server= \ + --threads= \ + --clients= \ + --requests= +``` + +## Having Troubles? Anything Unclear? + +Improving our documentation and helping the community is always of the higher priority for us, so +please feel free to reach out!