Back to Projects

Rustyload.

⚡ Blazingly Fast Load Testing Tool ⚡ HTTP | FlashKV (TCP Key-Value)

RUST

A load tester born from a database

After building FlashKV, I had an obvious question with no easy answer: how fast is it, actually? redis-benchmark worked, but I wanted to understand what a load generator does under the hood — how you saturate a server without lying to yourself about the numbers. So I built one.

RustyLoad is a concurrent load-testing CLI in Rust with a dual-protocol engine: it stress-tests HTTP/HTTPS services (any method, custom headers, request bodies) and speaks raw TCP to FlashKV-style key-value stores — PING, GET/SET, mixed workloads, and randomized key distribution across a configurable key space. It’s published on crates.io with prebuilt binaries for Linux, macOS, and Windows, built and released automatically through GitHub Actions.

Honest numbers: percentiles over averages

The statistics engine is the heart of the tool. Averages flatter a service; percentiles tell the truth. If the mean latency is 100ms but p99 is 2000ms, one in a hundred requests is twenty times slower than the number on the dashboard — and that’s the request users remember. RustyLoad reports min / max / average alongside p50, p95, and p99, computed with linear interpolation over the collected samples.

Concurrency is semaphore-limited: one async Tokio task per request, with a permit gate controlling how many run at once. That keeps pressure constant and measured — a load tester that overwhelms its own client machine produces numbers about the client, not the server.

| p50 (median):        210 ms |
| p95:                 445 ms |
| p99:                 823 ms |
| Requests/sec:        8.23   |

CLI ergonomics are a feature

Load testers are usually flag soup. RustyLoad has two modes: a quick mode for power users (rustyload -u https://api.example.com/health -n 500 -c 50) and an interactive mode that walks through protocol, target, workload, concurrency, and timeout with validated prompts — run it with no arguments and the wizard just starts. A live progress bar (indicatif) and a boxed configuration summary make long runs legible.

The stack is deliberately boring and solid: clap for argument parsing, reqwest for HTTP, dialoguer for prompts, anyhow for error handling — with unit tests covering the percentile math, statistics aggregation, and configuration builder. It was inspired by tools like wrk, hey, and bombardier; building my own taught me what those tools have to get right.

Source on GitHub · crates.io

Back to Projects