Orbitra Load Test: 480 req/s, Zero Errors, p99 182 ms

A tracker lives under load: every click is a write, a uniqueness check and a redirect. So before tagging v1.6.3 we rebuilt the uniqueness pipeline on a production-scale database and hammered it with stepped k6 load on our test bench. Here are the numbers.

TL;DR: On a 3.9M-click database (~1M of them in the last 24 hours), Orbitra sustained 480 req/s with zero errors and a 182 ms p99 β€” on a 2 vCPU / 7 GB cloud container. The upgrade migration took 0.04 s, the new index was built in a single 4.8 s cron pass, and reports over 3.2M clicks got faster β€” with numbers identical to the previous version, row for row.
Bottom line: 480 req/s with zero errors on a 3.9M-click database β€” from a tracker with no ClickHouse, no Redis and no license fee.

Why we ran the test

v1.6.3 made the duplicate filter honest toward mobile NAT: the uniqueness key became IP + user agent instead of IP alone. Behind one carrier NAT IP, two different people used to collide β€” the second visitor got a subid with no click row in the database, and his conversion had nothing to attach to.

The change required a new ua_hash column and a composite index on a database already carrying real volume. That is the scariest kind of migration β€” so before tagging the release, we replayed the exact path a user install takes, on production-scale data.

The test bench

Results

Run (3.2M-click DB unless noted)rpsErrorsp99CPU
Unique visitors, stock FPM (~50k DB)480046 ms76%
Unique visitors480075 ms77%
Repeat visitors (50 NAT pairs)4800, ~1% via spool14 ms61%
Unique + panel open, reports refresh every 2 s3200587 ms81%
Unique, tuned FPM/nginx, geo DB on5600187 ms94%
Unique, deliberately overloaded80027% timeoutsβ€”97%

And the migration rehearsal on the 3.9M-click snapshot: the first request after the β€œupgrade” ran migration 55 in 0.04 s, one cron pass built the index in 4.8 s and backfilled 1,008,085 UA hashes in 29.6 s β€” and NAT traffic at 480 req/s went through with zero errors and a 182 ms p99, every subid in the database. The previous version lost 27,775 subids in the same scenario; the new one lost zero.

Two details worth calling out. Even at 800 req/s β€” past the breaking point β€” every single served redirect was still written to the database: overload degrades latency, not durability. And hash correctness got its own check: a 2,000-row sample verified against PHP’s crc32 β€” zero mismatches.

The economics: one click costs about 2.5 ms of CPU, which puts the ceiling of a 2 vCPU box at ~550–600 req/s, CPU-bound. On 4 vCPU the same math extrapolates to ~1,000 req/s β€” measured on paper only, and labeled as such.

What the stress test caught before release

Half the value of the run is the bugs it flushed out β€” all fixed before the tag:

Why it holds up

Honest caveats

What this means for you

A modest VPS β€” the class most guides recommend for a start β€” already has headroom for serious daily volumes, and no per-event billing waits above it. If you are on Keitaro because “SQLite won’t survive”, this is the dataset to look at.

Orbitra installs on a clean Ubuntu server in about 15 minutes β€” one command, and the live demo is open if you want to poke around the panel first.

FAQ

What hardware was the test run on?

A cloud container with 2 vCPU and 7 GB RAM on Ubuntu 24.04, nginx and PHP-FPM in the stock configuration install.sh leaves behind, and k6 on the same box β€” so the numbers are, if anything, understated. Absolute numbers always depend on your VPS: you scale the server, not the tariff.

Do these results apply to the current version?

The test ran on the v1.6.3 release candidate. The storage architecture (SQLite + write spool + uniqueness indexes) is the same in current releases; changes since then are features and UI.

Why SQLite instead of ClickHouse?

One file, WAL mode, no separate database server. At low-to-mid volumes the bottleneck is disk I/O, not RAM, so a cheap VPS goes a long way. For sustained millions of clicks per day, a columnar architecture is stronger β€” we say so openly.

Did the upgrade lose any data?

In the repeat-visitor scenario the previous version lost 27,775 subids; the new one lost zero. Reports over 3.2M clicks matched the previous version row for row.

Related reading

vs Voluum

Voluum Alternative: Free Self-Hosted Tracker

Voluum starts at ~$149/mo. Orbitra is a free self-hosted tracker with built-in cloaking and 50+ CPA integrations. Full comparison and migration guide.

Read article β†’
vs Keitaro

Keitaro Alternative: Free Self-Hosted Tracker

The closest self-hosted competitor β€” but the license starts at $79/mo. Feature comparison plus one-click campaign import.

Read article β†’