Sizing an Apache Superset deployment

Size Apache Superset from concurrent users, dashboard fan-out and peak usage rather than data volume, then budget separately for workers, cache and the metadata database.

On this page

Sizing an Apache Superset deployment starts with users and peaks, not data volume

Superset load tracks concurrent users, the number of chart queries each dashboard load triggers, and when those users peak. Data volume mainly affects the warehouse, not the Superset servers, because Superset sends queries to your database and renders the results. A platform lead asking for infrastructure before rollout should therefore collect user counts by role, expected concurrency during business hours, and the dashboards that many people open at the same moment, then size Superset around those numbers. The architecture documentation describes four components: the Flask and React application, a metadata database, an optional caching layer, and optional Celery worker and beat processes. The application and metadata database are always present. The metadata database must be PostgreSQL or MySQL in production, since the SQLite default is not recommended for production use.

The caching layer and Celery workers are not optional for every installation. According to the architecture documentation, alerts and reports, async queries and dashboard thumbnails require both the caching layer and the worker components, and most installations use Redis and Celery for them. Decide early which of these features you will enable, because each one adds a service, a queue and recurring load that the web tier does not carry. If you plan to offer scheduled reports to many recipients or shared dashboards that many teams open at 9 a.m., the worker and cache tier will likely need its own capacity plan.

Treat every figure from this estimate as a hypothesis until you validate it. This section deliberately gives no fixed CPU, memory or replica counts, because they depend on your dashboard design, query latency, worker concurrency and warehouse behavior. Ask your team or partner to model peak concurrent sessions, the chart queries per dashboard load, and the expected report schedule, then run a load test against a staging environment that matches your production metadata database and cache. The results, not a general rule, should set the production sizing and the scaling thresholds you monitor.

Which sizing inputs drive each component

This table lists the main sizing input for each Superset component, what tends to raise its demand, and what to confirm with your team before estimating. Read each row against your own user counts and peak patterns, since the same user base can load components very differently depending on how dashboards are shared and refreshed.

ComponentMain sizing inputWhat raises demand and what to confirm
Web tierConcurrent users opening dashboards and Explore viewsDashboards with many charts, tabs and native filters, and shared dashboards opened at the same time. Confirm peak concurrent sessions and whether dashboards are shared to all-hands audiences.
Celery workersScheduled and on-demand async jobsAlerts and reports, async SQL Lab queries, thumbnail generation and cache warmup. Confirm report schedule density, how many recipients each report has, and whether thumbnails are enabled.
Cache layerDistinct chart and filter requests within cache timeoutsMany users asking the same questions, large result sets, and many datasets with short timeouts. Confirm cache timeouts per dataset and expected hit rates with your analysts.
Metadata databaseUsers, dashboards, charts, datasets and job recordsGrowth in object count, audit and log retention, and frequent report or alert history writes. Confirm retention policy for logs and report execution history, not data volume in the warehouse.
WarehouseQueries generated per dashboard load and per refreshChart count per dashboard, auto-refresh intervals, filter fan-out and cache misses. Confirm which engine serves each dataset, its concurrency limits and whether the warehouse team has set query quotas.

Which load spikes to plan for beyond average usage

Average daily sessions understate the load Superset must absorb. Peaks arrive when many people open the same shared dashboard, when charts refresh on their own, or when background jobs queue behind user activity. Each spike stresses a different component, so each needs its own check before you pick node sizes.

Shared dashboards at meeting time

A dashboard linked in a weekly review can draw most of a team into the same minute. Every open triggers web requests and chart queries, and identical charts may run again for each viewer if caching is cold. Check how many concurrent viewers the busiest dashboard expects, how many charts load on first render, and whether the web tier and the metadata database hold up at that concurrency. Ask your team to name the three most-opened dashboards and their meeting schedules.

Auto-refresh charts

A chart or dashboard set to refresh on an interval keeps issuing queries whether or not anyone is watching. Several open browser tabs multiply that load, and a short interval on a wide dashboard can keep the warehouse busy around the clock. Review refresh intervals against the warehouse capacity your team has agreed to, and confirm which users can set them. Refresh behavior is a sizing input for the warehouse as much as for Superset itself.

Async SQL Lab queries

Long SQL Lab runs can move to asynchronous execution, which hands the query to Celery workers and returns results later. Analysts who run many large queries at once can fill the worker queue and delay other async work. Estimate concurrent analyst sessions, typical query duration, and the worker concurrency needed to keep queue wait acceptable. Confirm the result backend and caching layer can hold the result sets your users will fetch.

Scheduled reports and alerts

Scheduled reports and alerts run from the worker layer and often fire at the same times, such as the start of a month or the top of the hour. Each run loads dashboards, renders output, and sends email or messages, which adds worker and browser load on top of user traffic. Map the schedule calendar to find collisions, and confirm that report rendering and delivery have enough worker capacity. The architecture documentation notes that alerts and reports require the caching layer and worker components.

Dashboard thumbnails in list views

Thumbnails render a dashboard or chart image when a user opens a list page, which can start a headless browser for each item not already cached. A list page with many dashboards can therefore create a burst of rendering work on first visit, even when no one is viewing the dashboards themselves. Check whether thumbnails are enabled, how many items a typical list page shows, and how much worker capacity is reserved for rendering. Confirm the thumbnail cache behaves as expected after a deployment restart.

Cache warmup runs

Cache warmup pre-computes popular dashboards on a schedule so that the first viewer after a refresh sees cached results. Warmup runs fan out queries against the warehouse all at once, and a broad warmup can produce a spike larger than the user traffic it is meant to absorb. Size the warmup against the warehouse and worker queue, stagger it away from report schedules, and limit it to dashboards that people open at known times.

How to estimate capacity before a pilot

This sequence turns user counts, dashboard behavior and scheduled work into a baseline topology that a load test on staging can confirm or correct before a pilot goes live. It keeps the estimate tied to how people use Superset rather than to how much data sits in the warehouse.

  1. Inventory users by role and time zone

    Start by listing every group that will sign in, grouped by Superset role (for example, viewers, editors, SQL Lab users and administrators) and by the time zones they work in. Pull the counts from your identity provider or the access model you plan to use, not from the business's rough estimate. Overlapping time zones matter more than total headcount, because they decide how tightly peaks cluster. The step is done when you have a table of named groups, headcounts and working hours, and the platform owner has confirmed that the list matches the people who will actually log in.

  2. List the most-viewed dashboards and charts

    Identify the dashboards that will carry most of the traffic, and for each one count the charts, tabs and native filters it renders on first load. Ask the owners of each dashboard how often it is opened and whether it auto-refreshes, since a single popular page can multiply query load more than dozens of quiet ones. Record which charts hit the same underlying datasets, because shared datasets affect how much warehouse work a single view triggers. The step closes when each top dashboard has a row with its chart count, refresh behavior and estimated views per day, and the owners have reviewed those numbers.

  3. Identify scheduled reports and thumbnail use

    Find every scheduled report and alert, its frequency, its recipients and its target format, and note whether it runs against a dashboard with many charts. Decide whether dashboard and chart thumbnails will be enabled, because the feature adds background rendering work that your workers must absorb. The Superset architecture documentation says alerts and reports, async queries and thumbnails depend on the caching layer and worker components, so this inventory determines whether those components are needed at all. The step is complete when you have a list of scheduled jobs with timing and a clear yes or no on thumbnails, each confirmed by the team that will own the job.

  4. Estimate concurrent peaks

    Convert the inventory into a peak estimate: how many users are likely active in the same short window, and how many chart queries and scheduled jobs fire in that window. Model at least one peak that combines a morning business-review hour with a scheduled report run, because shared dashboards tend to produce synchronized spikes. Treat the output as a set of stated assumptions with a stated multiplier for uncertainty, not a single precise figure. Check the peak with the business owners of the top dashboards and with the warehouse team, who can confirm whether their concurrency limits will hold under that load. The step is done when the peak scenario is written down, signed off by both groups and linked to the dashboard inventory.

  5. Choose a baseline topology

    Select a starting topology that matches the peak: the number of web replicas, the worker and beat processes, the cache layer and a metadata database that the Superset docs recognize for production, which means PostgreSQL 10 to 17 or MySQL 5.7 or 8.x rather than SQLite. Decide which components are required by your features, so that a deployment without reports or thumbnails does not carry workers it does not use. Record the chosen versions and the reasons for each component in a short design note that the platform team can review. The step is complete when the design note lists every component, its role and the assumption behind it, and when the team agrees it is a starting point to be tested rather than a final answer.

  6. Validate the baseline with a staging load test

    Build the staging environment from the same topology and configuration as the planned production setup, then replay the peak scenario with realistic user sessions, dashboard loads and scheduled jobs. Watch web response times, worker queue depth, cache hit rates, metadata database connections and warehouse query concurrency at the same time, since a bottleneck in one layer often shows up as slowness in another. Compare the results with the assumptions in the design note and adjust either the topology or the assumptions, then repeat the test. Confirm the final numbers with the business owners of the top dashboards before the pilot opens. The step is done when the test results meet the response expectations the owners set, the adjustments are recorded, and the team knows which metric will trigger a scale-out during the pilot.

Sizing differences for pilot, departmental and enterprise rollouts

A pilot usually serves one team, a small set of dashboards and a handful of named analysts who work in the tool during business hours. The goal is to learn how the team uses Superset, which charts and datasets matter and where the warehouse feels pressure, so the footprint should stay small and easy to rebuild. A single host running the web application, with the metadata database on the same machine or a separate small instance, is often enough at this scale. Expect to rely on the defaults of the Quickstart or PyPI install only for a throwaway evaluation, because the architecture documentation does not recommend SQLite or the Docker Compose PostgreSQL container for production.

  • Components added: the Flask and React application and a metadata database, with PostgreSQL or MySQL in place of SQLite if the pilot may become a real service.
  • Optional layers: caching, Celery workers and beat are usually deferred until a feature needs them, such as alerts, reports or async queries.
  • Operational habits: take a backup of the metadata database and keep a staging copy for upgrades, since the upgrade guidance expects both.
  • Usage to record: the number of concurrent users at peak, the slowest dashboards and the queries that run longest on the warehouse.
  • Access setup: a local admin account is acceptable for the pilot, but plan the identity integration before more teams join.

Before moving up a tier, confirm which features the pilot team actually uses, how often they wait on dashboards and whether the warehouse team has noticed the query load.

Budgeting for reports, alerts and thumbnails

Reports, alerts and dashboard thumbnails are background workloads, and they should be sized as their own queues rather than folded into the capacity you planned for interactive dashboard traffic. The Superset architecture documentation says alerts and reports, async queries and dashboard thumbnails require the caching layer and Celery worker components, and most installations run them on Redis and Celery. That means the budget has two parts: the web tier that serves people, and the worker and cache tier that runs scheduled and deferred jobs. If a nightly report batch competes with daytime users for the same worker slots, both groups feel it.

Thumbnails add a different kind of load. Generating them relies on a headless browser that renders each dashboard or chart, which is far heavier per job than a metadata query, and the rendered images are stored in a thumbnail cache. Expect the cost to rise with the number of dashboards that appear in lists and with how often they change. Scheduled reports create bursts: many subscriptions set to the same hour can start together and queue behind one another. Test a realistic peak by scheduling a batch of reports across the busiest hour, then watch queue depth, worker memory, cache size and the time until the last report is delivered.

Confirm thumbnail and report requirements against the Superset configuration for your exact version before you size anything, because the feature flags, worker queue names, thumbnail settings and browser requirements are version-dependent. Check the configuration reference for the release you plan to run, and ask your team to record which queues, concurrency values and headless browser setup each background workload uses. Capacity for these jobs is also recurring: it grows with report subscriptions and dashboard count, so review it after each rollout of new scheduled content.

What goes wrong when Superset is undersized or oversized

Superset problems that look like application bugs often trace back to how the web tier, workers, cache and metadata database were sized relative to users and peak use. The cards below cover the failures we see most often, the symptom each one produces and the direction of the fix.

Slow dashboards from worker saturation

When async queries, scheduled reports and thumbnail jobs share one Celery queue, a burst of dashboard refreshes can wait behind report generation and users see spinners that never resolve. The symptom is slowness that appears only at certain hours, not on every page load. Check queue depth and worker concurrency during a shared dashboard peak, then split queues by workload and size each pool to that peak, not to the average.

Metadata database connection exhaustion

Each web process and worker opens its own connections to the metadata database, so adding replicas can exhaust the database's connection limit faster than it adds capacity. The symptom is intermittent errors on login or dashboard saves when traffic rises, while CPU on the database stays low. Count connections per process across every web and worker replica, then add a pooler or reduce pool sizes before adding more replicas.

Cache misses pushing load to the warehouse

If the caching layer is undersized or evicts entries too early, most chart requests reach the warehouse again, so the warehouse bill and query queues grow with every viewer of the same dashboard. The symptom is a low cache hit rate during busy hours and warehouse concurrency limits being reached. Check hit rates and eviction counts at peak, and size the cache memory for the set of popular dashboards and their filter combinations.

Timeouts from web tier limits

Gunicorn worker counts, request timeouts and the reverse proxy timeout each set a separate ceiling, and the lowest one decides what users see. When a chart query runs longer than the proxy allows, the browser reports a gateway error even though the query finishes in the background. Align the proxy, web server and query timeouts, and add web replicas when requests queue behind a small number of busy workers.

Oversized hosts that hide query problems

A large host can absorb inefficient dashboards for months, so teams add capacity instead of fixing the charts that generate the load. The symptom is rising cost with flat user growth and slow dashboards that remain slow after each resize. Review which datasets and charts drive the most query time and cache misses before increasing host size, and treat a resize as a test of whether the load is now bounded.

Resizing during upgrades

Upgrades run database migrations and may change worker or cache behavior, so a host sized for the current release can behave differently after the upgrade. The symptom appears right after cutover when migration jobs compete with live traffic. Plan the upgrade window with a staging load test that matches production peaks, and confirm resource needs in the release notes for the target version before changing capacity.

Questions teams ask before sizing Superset

How many users can one Superset instance support?

No supplied figure gives a fixed user count, and the number depends on how people use Superset, not how many accounts exist. Sizing starts from concurrent viewers, how often dashboards refresh, how many charts each dashboard contains, and how many people run SQL Lab queries or Explore charts at the same moment. A team of a few hundred registered users who open one dashboard each morning places very different demands on the web tier than a smaller group that runs scheduled reports and builds ad hoc queries all day. Ask your sizing partner to model peak concurrency from your own usage logs, and confirm the target with a load test on a staging copy before you fix the replica count.

Does data volume drive Superset sizing?

Data volume matters far less than usage. Superset sends queries to your warehouse or database and displays the results, so the heavy processing happens in the query engine. The Superset application needs memory and CPU to render charts, handle requests and serialize results, and the amount it needs grows with the number of concurrent queries and the size of the result sets returned to the browser. Row limits and pre-aggregated datasets therefore influence web and worker load more than the total size of the underlying tables. The metadata database stores dashboards, charts, users and logs, so it grows with configuration and activity, which you should check when planning its storage and backups.

What does sizing work cost, and who gets paid for it?

Sizing is usually a one-time analysis priced as part of a fixed-scope engagement, with a written scope agreed before work starts. DeployOpen does not publish prices, so a quote follows from the scope. The main cost components are the discovery of users, dashboards and query patterns, the review of your warehouse and network, the capacity model and the load tests that confirm it. Costs rise when usage data is scattered across tools, when many dashboards need individual review, or when several environments must be sized separately. Ask each vendor to state what is one-time (the model and tests) and what recurs (re-sizing after growth or major upgrades), and to list the infrastructure assumptions in the quote.

How long does a Superset sizing exercise take?

No supplied figure gives a standard duration, so treat any number you hear as a claim to verify. Duration depends on how quickly you can export usage data, how many dashboards and databases are in scope, whether a staging environment matches production, and how many load test cycles are needed. Teams with clean access logs and a staging copy usually finish faster than teams that must reconstruct usage from memory. Ask for milestones in the written scope, including the data handover date, the capacity model review and the load test window, so that delays in your part of the work are visible early.

What must our team provide before sizing starts?

Sizing needs accurate inputs more than extra hardware. Expect to provide the list of Superset roles and active users, recent usage or audit data, the dashboards that refresh automatically or are shared widely, the databases and warehouses they query, and any report or alert schedules. You should also provide the current deployment topology, the metadata database version, the cache and broker choices, and the network path to your data sources. An account with read access to these systems, and a named contact who can approve staging load tests, prevents most delays. If you cannot export usage data, the first deliverable is a plan to collect it.

Can our own team size Superset internally?

Yes, a capable internal team can size Superset, provided it has access to usage data, a staging environment and time to run load tests. The work needs knowledge of the four Superset components described in the architecture documentation: the Flask and React application, the metadata database, the optional caching layer and the optional Celery worker and beat processes. Reports, async queries and thumbnails depend on the caching layer and workers, so a sizing that covers only the web tier understates the real load. Internal teams often underestimate the cost of repeated load tests and of keeping the model current. Compare the internal effort with a partner's written scope before deciding.

How do we keep Superset sizing current after upgrades?

Treat sizing as a recurring check that runs with every upgrade. The upgrade documentation says to back up the metadata database, run superset db upgrade and superset init, test in staging first and check UPDATING.md for breaking changes. Those steps change behavior and performance, so repeat the load test on staging after each major or minor version and compare the results with your previous baseline. Release dates for recent versions are listed on the Apache Superset releases page on GitHub, which helps you schedule these checks. Also re-run sizing when user counts, dashboard counts or report schedules change materially.

Which Superset components need the most capacity planning?

The answer depends on which optional features you enable, so list them first. Alerts and reports, async queries and dashboard thumbnails require the caching layer and worker components, and most installations use Redis and Celery for them. Each of these adds load that the web tier alone does not show. The metadata database should run on PostgreSQL or MySQL in production, because the SQLite default is not recommended. The supported metadata database versions are PostgreSQL 10 to 17 and MySQL 5.7 and 8.x, according to the configuration documentation, and your sizing should confirm the version you run falls within that range.

How DeployOpen works on this

DeployOpen plans, implements and documents self-hosted Superset inside your own infrastructure, so sizing decisions come from your user counts, peak dashboard use and reporting schedule. Engagements are fixed-scope, with the sizing method, test plan and deliverables agreed in writing before work starts.

How we scope

  • Written scope lists the user groups, dashboards, reports and alerts that the sizing must cover.
  • Scope records the expected concurrent viewers, peak times and whether shared dashboards refresh automatically.
  • Scope names the metadata database, cache and worker components you plan to run and why.
  • Scope states which environments, cloud accounts or data centers the sizing applies to.
  • Engagements are fixed-scope, and ongoing support can be added as a retainer once the scope is agreed.

How we build

  • We model web, worker, cache and metadata database capacity from user and peak assumptions, not from data volume.
  • We size headroom for scheduled reports, alerts and thumbnail generation alongside interactive viewing.
  • We run load tests against staging with representative dashboards and record latency, memory and queue depth.
  • We document how Gunicorn workers, Celery concurrency and Redis memory change as user counts grow.
  • We check the metadata database against the supported PostgreSQL and MySQL versions before recommending a size.

How we hand over

  • You receive a sizing workbook with assumptions, formulas, test results and the recommended starting resources.
  • The runbook explains which metrics to watch, the thresholds that trigger scaling and who acts on them.
  • We walk your platform and data engineering teams through the sizing model so they can rerun it as usage changes.
  • Deliverables include configuration for the chosen resource limits, documented in your own repositories.
  • Handover records open questions, such as capacity you still need to confirm with your cloud or hardware team.

How we support

  • Retainers can cover periodic resizing reviews as user counts, dashboards and report schedules change.
  • Support can include re-running load tests before a Superset version upgrade, using your staging environment.
  • We help review sizing when you add embedded analytics, thumbnails or new async query workloads.
  • Post-handover changes are scoped in writing, with the same method used for the original sizing.
  • Your team keeps ownership of the environment, and DeployOpen works inside the infrastructure you control.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.