Benchmark methodology
This page describes how Liteset was benchmarked against upstream Apache Superset 6.0.0. The goal is fair, reproducible measurement — same hardware, same dataset, same load profile, only the backend's concurrency model changes.
The single variable between every pair of runs is the backend: Flask + Gunicorn (4 sync workers) versus Litestar + Uvicorn (4 workers + uvloop). The database, data, network and load generator are identical.
A personal note from the author
This is my first load-testing effort at this scale, and it was done as part of a diploma thesis rather than in a dedicated benchmarking lab. I've tried to keep the methodology fair and reproducible, but I may well have made mistakes somewhere. Please don't judge too harshly — and if you're interested and notice any errors or weak spots, I'm genuinely open to criticism and feedback.
Test bench
| Component | vCPU | RAM | Disk | Notes |
|---|---|---|---|---|
| Backend VM | 4 | 8 GB | — | 100 % vCPU cap; Flask/Gunicorn or Litestar/Uvicorn |
| Locust VM | 2 | 4 GB | — | load generator, same LAN |
| PostgreSQL 16 | 4 | 16 GB | 50 GB NVMe | metadata + analytical data; the IO bottleneck |
Host: Dell PowerEdge R420, 2× Xeon E5-2420 v2 (2.6 GHz), DDR3 ECC, NVMe SSD, Rocky Linux 9. All services run in Docker Compose.
PostgreSQL is deliberately under-provisioned relative to the data volume so analytical queries take 5–50 s, making the workload IO-bound. Tuning: shared_buffers = 4 GB, work_mem = 64 MB, effective_cache_size = 12 GB, random_page_cost = 8, max_parallel_workers = 4.
Software under test
| Variant | Stack |
|---|---|
| Apache Superset 6.0.0 | Flask + Gunicorn, 4 sync workers, 300 s timeout |
| Liteset | Litestar + Uvicorn, 4 workers + uvloop, async event loop |
Equal worker counts (4 each) isolate the concurrency model: a sync worker handles one request at a time and blocks on IO; an async worker multiplexes many coroutines in one process. Both run against the same PostgreSQL instance with no schema changes — superset_config.py is loaded unmodified.
Dataset
The analytical database is loaded with the Star Schema Benchmark (SSB) at Scale Factor 10 — ~60 M rows in LINEORDER plus four dimension tables (CUSTOMER, SUPPLIER, PART, DATE). SSB is a standard analytical benchmark with deterministic generation (ssb-dbgen), realistic JOIN/aggregation queries and wide academic use. On top of it, 10 dashboards of 6–12 charts each implement the four standard SSB Query Flights (Q1.1–Q4.3).
Load generator
Load is generated with Locust from a separate VM on the same LAN to minimise network latency.