Skip to main content

Document Generation — Performance Report

Date: January 25, 2026 Target: https://api.rynko.dev/api (production) Suite: Rynko Performance Suite v1.0.0 Result: 15/15 tests passed, 0 failures


What Was Tested

The full performance suite was run against Rynko's production API — 15 tests across 5 categories covering API latency, throughput, document generation, limit enforcement, and load behavior. All tests ran against the live infrastructure with real document rendering.


API Latency

Baseline response times for core API operations, measured over 50 iterations each.

EndpointMinP50P95P99Mean
Health Check (unauthenticated)466ms473ms480ms482ms473ms
Authenticated API (JWT)468ms479ms735ms870ms563ms
API Key Authentication735ms750ms773ms941ms758ms

API key auth is slower than JWT because the key lookup involves a SHA-256 hash comparison against the database on every request, while JWT validation is a local signature check.


Document Generation Performance

End-to-end timing from API request to completed document, including queue wait and rendering. Measured over 50 iterations per format.

PDF Generation

MetricValue
P50 (median)1.55s
P952.56s
P992.56s
Mean1.75s
Min1.54s
Max2.57s

Breakdown:

PhaseTime
Queue wait538ms
Processing (render + upload)1.21s
Total1.75s

Excel Generation

MetricValue
P50 (median)1.55s
P952.11s
P992.46s
Mean1.65s
Min1.54s
Max2.54s

Breakdown:

PhaseTime
Queue wait538ms
Processing (render + upload)1.11s
Total1.65s

Batch Generation

MetricValue
Batches submitted3
Success rate100%
Throughput1.33 batches/sec
note

These tests ran on a Free tier account with a concurrent job limit of 1. The queue wait (~538ms) reflects jobs waiting for the single processing slot. On paid tiers with higher concurrency (5–25 concurrent jobs), queue wait drops significantly and total generation time approaches the pure processing time of ~1.1–1.2s.


Throughput

Sustained request capacity measured over 30-second windows.

TestTotal RequestsRPSError Rate
API Throughput2538.230.00%
Document Submission Throughput31610.360.00%

Load Tests

System behavior under different load patterns.

Sustained Load (30s continuous)

MetricValue
Requests35
RPS1.16
Error Rate0.00%
P50 Latency741ms
P95 Latency1.15s

Traffic Spike (burst pattern)

MetricValue
Requests98
RPS6.53
Error Rate0.00%
P50 Latency511ms
P95 Latency1.76s

Concurrency Scaling

MetricValue
Requests796
RPS96.80
Error Rate0.00%

The concurrency scaling test ramps from low to high concurrency to measure how the system handles increasing parallel load. At peak, the API handled 96.8 requests per second with zero errors.


Stress Test: 2,000 Documents (Single User)

A separate stress test submitted 2,000 PDF documents in rapid succession and measured server-side throughput using timestamps from the API (not client-side polling).

MetricValue
Documents submitted2,000
Documents completed2,000
Failed0
Error rate0.00%
Submission time47.8s
Server window (first submit → last complete)56.9s
Throughput35.17 docs/sec (2,110 docs/min)

Server-Side Timing

PhaseAvgP50P95P99
Queue Wait3,381ms2,614ms7,795ms8,759ms
Processing1,335ms1,109ms3,116ms4,160ms
Total Turnaround4,716ms4,042ms9,038ms9,720ms

Bottleneck analysis: 71.7% of turnaround time was spent waiting in queue, 28.3% in processing. This is expected on a single-concurrent-job tier — the queue backs up because only one document renders at a time. The actual rendering (PDFKit + Yoga layout + S3 upload) consistently completed in ~1.1s at p50.


Limit Enforcement

LimitExpectedObservedEnforced
API Rate Limit (login)5 req/window5Yes
Concurrent Jobs1 (Free tier)11*No*
Backlog10 (Free tier)15*No*
Batch Size10 (Free tier)15*No*

*Concurrent, backlog, and batch limits were observed higher than expected at the time of testing. These limits were subsequently tightened and are now enforced correctly on all tiers.


Test Configuration

target:
baseUrl: https://api.rynko.dev/api
timeout: 30000ms
execution:
iterations: 50
concurrency: 5
loadDurationSeconds: 30
targetRps: 50

Key Takeaways

  1. PDF rendering at ~1.1s p50 — the pure rendering time (PDFKit + Yoga layout engine) is consistent. The remaining latency is queue wait and S3 upload.
  2. Zero errors under load — 2,000 documents submitted in under a minute with 0% failure rate.
  3. 96.8 RPS API capacity — the API layer handles nearly 100 requests per second before document processing becomes the bottleneck.
  4. Queue wait is the variable — on Free tier (1 concurrent job), queue wait dominates. On paid tiers with 5–25 concurrent slots, total generation time drops toward the ~1.1s processing baseline.