Urus Benchmark Report

HTTP/1.1 Performance: Urus vs. Axum

Run Date: May 26, 2026
Run ID: 20260526-220625
Scenarios: S1–S4

Summary

Urus RPS

53–54k

Consistent s1–s4

Axum RPS

288–320k

Consistent s1–s4

Performance Gap

5.7×

Axum faster (RPS)

Results

Framework Scenario Sustained RPS p99 Latency Description
Urus S1 54,640 2.70ms Bare HTTP
Urus S2 53,139 2.62ms + Middleware (logger, auth, router)
Urus S3 53,616 2.67ms + In-memory store (mixed workload)
Urus S4 52,590 2.53ms + SQLite (1 writer, 4 readers)
Axum S1 288,330 11.64ms Bare HTTP
Axum S2 315,596 49.66ms + Middleware (logger, auth, router)
Axum S3 316,342 60.45ms + In-memory store (mixed workload)
Axum S4 320,150 56.13ms + SQLite (sqlx::SqlitePool)

Spec Compliance

Target: Urus RPS ≥ 50% of Axum ("within 2×") on S1 and S2.

Scenario Urus RPS Axum RPS Ratio Status
S1 54,640 288,330 0.19 (5.3×) FAIL
S2 53,139 315,596 0.17 (5.9×) FAIL
S3 53,616 316,342 0.17 (5.9×) FAIL

Observations

  • Consistent Gap: Axum is 5.3–5.9× faster across all scenarios. The gap does not narrow with additional complexity.
  • No Performance Collapse: Both frameworks maintain stable RPS from S1 to S4. Urus holds 52.6–54.6k RPS; Axum holds 288–320k RPS. SQLite does not degrade either one.
  • Tail Latency Pattern: Axum's p99 rises with load (11.6ms → 60.5ms). Urus remains sub-3ms across all scenarios. This is typical of async Rust under concurrent load vs. actor-based systems (BEAM behavior).

Analysis

RPS Shortfall

  • Urus fails the 2× target by 3.3–5.9×. This is the primary result.
  • The gap stems from Urus's message-passing model: each request is routed through actor channels, adding per-request overhead vs. Axum's direct memory access and async scheduling.
  • This is a fundamental architectural difference, not an optimization opportunity.

Tail Latency Observation

  • Urus exhibits sub-3ms p99 under all loads. Axum's p99 grows linearly with concurrency (11–60ms). This mirrors known BEAM vs. async Rust behavior: actor systems maintain consistent tail latency, async/await shows load-dependent tail growth.
  • This is notable but not a spec redemption. Both metrics matter. Urus's low tail latency is a side effect of lower throughput, not architectural superiority—at identical offered load, the comparison would differ.
  • For workloads with strict tail-latency SLAs and modest throughput needs, Urus's profile could be preferable. For high-throughput services, Axum's throughput advantage outweighs tail-latency concerns.

Conclusion

Urus does not meet the spec target of "within 2× of Axum RPS." It is 5.3–5.9× slower. This gap is consistent across all scenarios.

Verdict: FAIL on throughput (primary benchmark metric). Tail latency is a secondary characteristic; do not use it to offset the RPS result.