Black-box load tests for tuber, a Rust rewrite of beanstalkd. Exercises the server through its wire protocol only — no dependency on tuber's source — so tests survive internal refactors and also smoke-test client libraries in each language.
ruby/ Ruby raw-TCP pressure scripts (first citizen)
python/ (planned)
go/ (planned)
Each language contains:
- a minimal raw-TCP driver used by pressure scripts, kept deliberately thin so that throughput numbers measure the server, not the client library;
- optional gem/package smoke tests that exercise the idiomatic client library for that language at modest volume, to catch binding bugs.
cd ruby
bundle install # currently no external gems; runs clean
bundle exec ruby bin/flood_puts.rb --count 100000 --tube pressureSee ruby/bin/ for the available scripts.
- Throughput under high-volume
put - Idempotency via
idp:(dedup behavior, storage growth) - Group / after-group chains via
grp:+aft:(dependency scheduling) - Concurrency keys via
con:(serialization correctness) - Mixed producer + worker workloads (reserve / delete / release / bury / kick)
- WAL behavior under sustained write load (when
-bis enabled on the server)
1M puts, 8 threads, 64-byte body, flood_puts.rb:
| fsync | ops/sec | p50 (ms) | p95 (ms) | p99 (ms) | max (ms) |
|---|---|---|---|---|---|
| 10s | 39,428 | 0.188 | 0.285 | 0.436 | 135 |
| 1s | 39,429 | 0.187 | 0.282 | 0.434 | 180 |
| 100ms | 38,203 | 0.189 | 0.286 | 0.446 | 177 |
| 50ms | 38,060 | 0.185 | 0.285 | 0.459 | 189 |
| 25ms | 38,141 | 0.178 | 0.286 | 0.478 | 167 |
| 20ms | 37,669 | 0.177 | 0.279 | 0.465 | 214 |
| 15ms | 36,825 | 0.171 | 0.279 | 0.542 | 127 |
| 10ms | 34,031 | 0.169 | 0.293 | 4.043 | 130 |
Takeaway: ≥25ms fsync has no measurable cost vs effectively-disabled (10s). At 10ms, p99 jumps ~8x as ops begin blocking on sync completion.
- Correctness unit tests of tuber internals — those belong in the tuber repo.
- Benchmarking tuber against other beanstalkd implementations. (Out of scope for now; the tooling could support it later.)