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.
| Endpoint | Min | P50 | P95 | P99 | Mean |
|---|---|---|---|---|---|
| Health Check (unauthenticated) | 466ms | 473ms | 480ms | 482ms | 473ms |
| Authenticated API (JWT) | 468ms | 479ms | 735ms | 870ms | 563ms |
| API Key Authentication | 735ms | 750ms | 773ms | 941ms | 758ms |
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
| Metric | Value |
|---|---|
| P50 (median) | 1.55s |
| P95 | 2.56s |
| P99 | 2.56s |
| Mean | 1.75s |
| Min | 1.54s |
| Max | 2.57s |
Breakdown:
| Phase | Time |
|---|---|
| Queue wait | 538ms |
| Processing (render + upload) | 1.21s |
| Total | 1.75s |
Excel Generation
| Metric | Value |
|---|---|
| P50 (median) | 1.55s |
| P95 | 2.11s |
| P99 | 2.46s |
| Mean | 1.65s |
| Min | 1.54s |
| Max | 2.54s |
Breakdown:
| Phase | Time |
|---|---|
| Queue wait | 538ms |
| Processing (render + upload) | 1.11s |
| Total | 1.65s |
Batch Generation
| Metric | Value |
|---|---|
| Batches submitted | 3 |
| Success rate | 100% |
| Throughput | 1.33 batches/sec |
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.
| Test | Total Requests | RPS | Error Rate |
|---|---|---|---|
| API Throughput | 253 | 8.23 | 0.00% |
| Document Submission Throughput | 316 | 10.36 | 0.00% |
Load Tests
System behavior under different load patterns.
Sustained Load (30s continuous)
| Metric | Value |
|---|---|
| Requests | 35 |
| RPS | 1.16 |
| Error Rate | 0.00% |
| P50 Latency | 741ms |
| P95 Latency | 1.15s |
Traffic Spike (burst pattern)
| Metric | Value |
|---|---|
| Requests | 98 |
| RPS | 6.53 |
| Error Rate | 0.00% |
| P50 Latency | 511ms |
| P95 Latency | 1.76s |
Concurrency Scaling
| Metric | Value |
|---|---|
| Requests | 796 |
| RPS | 96.80 |
| Error Rate | 0.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).
| Metric | Value |
|---|---|
| Documents submitted | 2,000 |
| Documents completed | 2,000 |
| Failed | 0 |
| Error rate | 0.00% |
| Submission time | 47.8s |
| Server window (first submit → last complete) | 56.9s |
| Throughput | 35.17 docs/sec (2,110 docs/min) |
Server-Side Timing
| Phase | Avg | P50 | P95 | P99 |
|---|---|---|---|---|
| Queue Wait | 3,381ms | 2,614ms | 7,795ms | 8,759ms |
| Processing | 1,335ms | 1,109ms | 3,116ms | 4,160ms |
| Total Turnaround | 4,716ms | 4,042ms | 9,038ms | 9,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
| Limit | Expected | Observed | Enforced |
|---|---|---|---|
| API Rate Limit (login) | 5 req/window | 5 | Yes |
| Concurrent Jobs | 1 (Free tier) | 11* | No* |
| Backlog | 10 (Free tier) | 15* | No* |
| Batch Size | 10 (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
- 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.
- Zero errors under load — 2,000 documents submitted in under a minute with 0% failure rate.
- 96.8 RPS API capacity — the API layer handles nearly 100 requests per second before document processing becomes the bottleneck.
- 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.