| Crates.io | rustyload |
| lib.rs | rustyload |
| version | 0.2.2 |
| created_at | 2025-11-28 10:10:42.430139+00 |
| updated_at | 2025-11-28 10:10:42.430139+00 |
| description | A blazingly fast, concurrent HTTP load testing tool built in Rust |
| homepage | |
| repository | https://github.com/yourusername/rustyload |
| max_upload_size | |
| id | 1955085 |
| size | 188,500 |
A blazingly fast, concurrent load testing tool for HTTP and TCP services built in Rust
Features β’ Installation β’ Usage β’ How It Works β’ Architecture β’ Contributing
RustyLoad is a command-line load testing tool designed to stress-test web servers, APIs, and TCP-based services like key-value databases. Built with Rust's async runtime (Tokio), it can send thousands of concurrent requests while efficiently managing system resources.
Whether you're testing your local development server, benchmarking a production API, or load testing your Redis-like FlashKV database, RustyLoad provides detailed latency statistics including percentiles (p50, p95, p99) to help you understand your service's performance characteristics.
βββββββ βββ βββββββββββββββββββββββ ββββββ βββββββ ββββββ βββββββ
βββββββββββ ββββββββββββββββββββββββ βββββββ βββββββββββββββββββββββββ
βββββββββββ βββββββββββ βββ βββββββ βββ βββ ββββββββββββββ βββ
βββββββββββ βββββββββββ βββ βββββ βββ βββ ββββββββββββββ βββ
βββ ββββββββββββββββββββ βββ βββ ββββββββββββββββββββ βββββββββββ
βββ βββ βββββββ ββββββββ βββ βββ ββββββββ βββββββ βββ ββββββββββ
β‘ Blazingly Fast Load Testing Tool β‘
HTTP | FlashKV (TCP Key-Value)
Download the latest release for your platform from the Releases page.
# Download the latest release
curl -LO https://github.com/arino08/rustyload/releases/latest/download/rustyload-linux-x86_64.tar.gz
# Extract the binary
tar xzf rustyload-linux-x86_64.tar.gz
# Move to a directory in your PATH
sudo mv rustyload /usr/local/bin/
# Verify installation
rustyload --version
# For Intel Macs
curl -LO https://github.com/arino08/rustyload/releases/latest/download/rustyload-macos-x86_64.tar.gz
tar xzf rustyload-macos-x86_64.tar.gz
# For Apple Silicon (M1/M2/M3)
curl -LO https://github.com/arino08/rustyload/releases/latest/download/rustyload-macos-aarch64.tar.gz
tar xzf rustyload-macos-aarch64.tar.gz
# Move to PATH
sudo mv rustyload /usr/local/bin/
# Verify installation
rustyload --version
rustyload-windows-x86_64.zip from the Releases page.zip filerustyload.exe to a directory in your PATH (e.g., C:\Windows\System32\ or create a custom directory).\rustyload.exe --versionIf you have Rust installed:
# Install directly from GitHub
cargo install --git https://github.com/arino08/rustyload
# Or clone and install locally
git clone https://github.com/arino08/rustyload
cd rustyload
cargo install --path .
The binary will be installed to ~/.cargo/bin/rustyload.
# Clone the repository
git clone https://github.com/arino08/rustyload
cd rustyload
# Build in release mode (optimized)
cargo build --release
# The binary will be at ./target/release/rustyload
./target/release/rustyload --version
# Optionally, copy to your PATH
sudo cp target/release/rustyload /usr/local/bin/
RustyLoad offers two modes: Interactive Mode (beginner-friendly) and Quick Mode (for power users).
Simply run without arguments, or use the -i flag:
# Launches interactive configuration wizard
rustyload
# Or explicitly request interactive mode
rustyload -i
The interactive mode will guide you through:
π Interactive Mode - Let's configure your load test!
ββββββββββββββββββββββββββββββββββββββββββββββββββ
? Select protocol: HTTP/HTTPS (Web APIs, REST endpoints)
? Target URL: https://api.example.com/health
? HTTP Method: GET
? Number of requests: 100
? Concurrent requests: 10
? Timeout (seconds): 30
? Additional options: Skip (use defaults)
ββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Configuration complete!
π Interactive Mode - Let's configure your load test!
ββββββββββββββββββββββββββββββββββββββββββββββββββ
? Select protocol: FlashKV (TCP key-value database)
ποΈ FlashKV Load Test Configuration
? FlashKV server host: localhost
? FlashKV server port: 6379
? Select workload type: GET + SET mixed workload
? Base key: testkey
? Value for SET operations: testvalue
? Use random keys? Yes
? Key prefix: user
? Key range (0 to N-1): 10000
? Number of requests: 1000
? Concurrent connections: 50
? Timeout (seconds): 10
ββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Configuration complete!
If you know what you want, use CLI arguments:
# Basic HTTP usage with defaults (100 requests, 10 concurrent)
rustyload -u https://httpbin.org/get
# Custom requests and concurrency
rustyload -u https://api.example.com/health -n 500 -c 50
# Skip confirmation prompt with -y
rustyload -u https://httpbin.org/get -n 100 -c 10 -y
# Basic FlashKV PING test
rustyload -p flashkv -u localhost:6379 -n 1000 -c 50
# FlashKV with GET command
rustyload -p flashkv -u localhost:6379 --command "GET mykey" -n 1000 -c 50
# FlashKV with SET command
rustyload -p flashkv -u localhost:6379 --command "SET mykey myvalue" -n 1000 -c 50 -y
| Option | Short | Description | Default |
|---|---|---|---|
--url |
-u |
Target URL (HTTP) or host:port (FlashKV) | - |
--protocol |
-p |
Protocol: http, flashkv | http |
--requests |
-n |
Total number of requests to send | 100 |
--concurrency |
-c |
Number of concurrent requests | 10 |
--command |
- | FlashKV command (e.g., "GET key", "SET key value") | PING |
--interactive |
-i |
Run in interactive mode | auto |
--yes |
-y |
Skip confirmation prompt | false |
--help |
-h |
Show help message | - |
--version |
-V |
Show version | - |
Note: If you don't provide a URL, RustyLoad automatically enters interactive mode!
| Command | Description | Example |
|---|---|---|
PING |
Check server connectivity | PING |
GET |
Retrieve a value | GET mykey |
SET |
Store a value | SET mykey myvalue |
DEL |
Delete a key | DEL mykey |
INCR |
Increment a numeric value | INCR counter |
DECR |
Decrement a numeric value | DECR counter |
EXISTS |
Check if key exists | EXISTS mykey |
EXPIRE |
Set key expiration | EXPIRE mykey 3600 |
TTL |
Get time to live | TTL mykey |
KEYS |
List keys matching pattern | KEYS user:* |
LPUSH |
Push to list | LPUSH mylist value |
LPOP |
Pop from list | LPOP mylist |
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β π Configuration Summary β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β URL: https://httpbin.org/post β
β Method: POST β
β Requests: 100 β
β Concurrency: 10 β
β Timeout: 30s β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Headers: β
β Content-Type: application/json β
β Authorization: Bearer t... β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Body: {"name":"test"} β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
? Start load test? Yes
π Starting load test...
[00:00:12] [ββββββββββββββββββββββββββββββββββββββββ] 100/100 (100%) Complete!
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β π Results β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Total Requests: 100 β
β Successful: 100 (100.0%) β
β Failed: 0 β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β±οΈ Latency (ms) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Min: 145 ms β
β Max: 892 ms β
β Average: 234.56 ms β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π Percentiles β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β p50 (median): 210 ms β
β p95: 445 ms β
β p99: 823 ms β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π Throughput β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Requests/sec: 8.23 β
β Total time: 12156 ms β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Load test completed successfully!
Percentiles help you understand the distribution of response times:
| Percentile | Meaning |
|---|---|
| p50 (Median) | 50% of requests were faster than this value |
| p95 | 95% of requests were faster - shows "almost worst case" |
| p99 | 99% of requests were faster - catches outliers |
Why percentiles matter: If your average latency is 100ms but p99 is 2000ms, it means 1% of your users experience 20x slower response times!
RustyLoad uses a semaphore to control concurrency:
Concurrency = 3:
Request 1: ββββββββββββββββ (running)
Request 2: ββββββββββββββββ (running)
Request 3: ββββββββββββββββ (running)
Request 4: ββββββββββββββββ (waiting, then runs when slot opens)
This prevents overwhelming both your system and the target server.
rustyload/
βββ .github/
β βββ workflows/
β βββ ci.yml # GitHub Actions CI/CD
β βββ release.yml # Automated release builds
βββ docs/
β βββ TECHNICAL_GUIDE.md # Detailed technical documentation
βββ src/
β βββ main.rs # CLI parsing, orchestration
β βββ client.rs # HTTP client, load testing, statistics
β βββ interactive.rs # Interactive TUI prompts
βββ Cargo.toml # Dependencies and metadata
βββ README.md # This file
βββ LICENSE # MIT License
main.rsclap for argument parsingclient.rsreqwest with custom configurationindicatifinteractive.rs| Crate | Purpose |
|---|---|
tokio |
Async runtime for concurrent execution |
reqwest |
HTTP client for making requests |
clap |
Command-line argument parsing |
dialoguer |
Interactive terminal prompts |
indicatif |
Progress bar and spinners |
colored |
Terminal colors and styling |
anyhow |
Ergonomic error handling |
RustyLoad is designed to be efficient:
Arc for shared state, avoiding unnecessary clonesTested on a local server (your results may vary):
| Requests | Concurrency | Time | Req/sec |
|---|---|---|---|
| 1,000 | 10 | 2.3s | 434 |
| 1,000 | 50 | 0.8s | 1,250 |
| 10,000 | 100 | 5.2s | 1,923 |
RustyLoad includes a comprehensive test suite:
# Run all tests
cargo test
# Run tests with output
cargo test -- --nocapture
# Run a specific test
cargo test test_percentile
# Debug build (faster compile, slower runtime)
cargo build
# Run directly
cargo run -- -u https://httpbin.org/get -n 10
# Release build (slower compile, faster runtime)
cargo build --release
# Format code
cargo fmt
# Run linter
cargo clippy
# Check for issues without building
cargo check
Future enhancements planned:
Contributions are welcome! Here's how you can help:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)cargo fmt before committingcargo clippy passes without warningsThis project is licensed under the MIT License - see the LICENSE file for details.
Built with β€οΈ and π¦