Resources
CPU, memory, disk, and GPU requirements for Scrydon deployments
Use these requirements to size the cluster before running helm install.
Minimum (evaluation / small teams)
| Resource | Requirement |
|---|---|
| CPU | 6 vCPU |
| RAM | 32 GB |
| Disk | 80 GB (database + StarRocks + images) |
| GPU | Not required |
These numbers assume the full default stack: Platform UI, Agentic, Cortex, Analytics, the bundled Postgres, SeaweedFS, and a single-pod StarRocks for Managed Tables. To run on smaller nodes (4 vCPU / 16 GB), trim the optional components. See Helm → Trimming for low-resource installs.
Recommended (production)
| Resource | Requirement |
|---|---|
| CPU | 16 vCPU |
| RAM | 64 GB |
| Disk | 200 GB SSD |
| GPU | Optional. Required only for local AI model inference, such as running Ollama in-cluster. |
Note: GPU resources are contractually licensed (your license JWT reflects your entitlement), but Scrydon does not runtime-enforce GPU limits. GPU nodes are only needed if you plan to run local inference models inside your cluster.
Per-service memory
The Helm chart sets these per-pod memory requests and limits for single-replica defaults. The request is what the scheduler reserves. Your node pool must satisfy the sum of requests for enabled services before pods will schedule, so it is your reserved floor. The limit is the burst ceiling before a pod is OOM-killed.
To size node pools: sum the requests as the reserved floor, check the sum of limits for worst-case burst, then add ~30% headroom for kube-system pods, Dapr sidecars (~250 MiB each), the Dapr control plane, and small bundled infra such as OPA / Lakekeeper (~128 MiB each).
| Service | Memory request | Memory limit | Notes |
|---|---|---|---|
platform (UI) | 1 GiB | 2 GiB | SSR shell + control-plane routes |
agentic (workflow app) | 2 GiB | 4 GiB | Heaviest app: workflow engine + Dapr Workflow runtime |
agentic-realtime | 256 MiB | 512 MiB | WebSocket fan-out |
analytics (UI) | 1.5 GiB | 2 GiB | SSR + chart rendering; heaviest steady-state RSS |
cortex (chat UI) | 1 GiB | 2 GiB | SSR + LLM streaming proxy |
api-platform (auth/API) | 1 GiB | 2 GiB | Catalog + workspace sources |
api-ontology | 256 MiB | 512 MiB | Optional |
api-table | 256 MiB | 512 MiB | Enabled by default; backs Managed Tables. Disable with apiTable.enabled: false. |
marimo-document | 128 MiB | 512 MiB | Stateless, compute-free notebook document renderer |
infra.db (Postgres) | 256 MiB | 1 GiB | Bundled. Disable if using managed Postgres. |
infra.seaweedfs | 256 MiB | 1 GiB | Bundled. Disable if using managed S3. |
infra.starrocks | 2 GiB | 8 GiB | Enabled by default (single-pod allin1). Disable with infra.starrocks.enabled: false or replace with the StarRocks Operator for multi-AZ. |
Isolated notebook compute is additional and schedules in runtimePlane.workloadNamespace.
Each active interactive runtime reserves 4 GiB for Marimo plus 1 GiB for source control,
512 MiB for its broker, and 128 MiB for the egress enforcer (5.625 GiB total). A notebook job
reserves 4 GiB for its runner plus 128 MiB each for its broker and enforcer (4.25 GiB total).
Size the Kata/KVM node pool for expected concurrent sessions and jobs; opening documents does
not consume this capacity.
Limits were last revised on 2026-05-18 (v1.3.5-rc.54 binary-minification rollout, PR #1142, which roughly doubled steady-state RSS for the SSR apps; the platform limit was subsequently raised to 2 GiB on 2026-05-29). Requests were right-sized on 2026-07-06 (PR #2257) to track measured steady-state RSS. The previous requests understated real usage 2-4x, so the scheduler over-packed nodes and pods were evicted mid-rollout under memory pressure. If you upgrade across either boundary on a pre-existing cluster, verify your node pool has headroom before running helm upgrade.
AI Gateway
The AI Gateway runs inside the api-platform pod, so its
cost lands on that Deployment's CPU rather than on a service of its own. The
chart ships auth.resources at a 500m request and a 2000m limit. That default
carries the control-plane traffic api-platform already serves; router traffic is
additional, and is the one workload on this page that scales with how your
people work rather than with how many services you enabled.
What one turn costs
A turn's CPU cost is a small fixed part plus a part that scales with the number of streamed events, not with the number of bytes. Your DLP posture changes the per-event term, so there are three curves rather than one:
| DLP mode | CPU per turn |
|---|---|
disabled | 0.017 vCPU-s + 0.14 ms × events |
audit | 0.025 vCPU-s + 0.18 ms × events |
enforce | 0.026 vCPU-s + 0.20 ms × events |
The event term is the one that matters. A coding agent streams roughly one event per generated token, so a turn that writes 600 tokens costs about five times a turn that writes 100 — even though both are small responses. Note that DLP is almost entirely a per-event cost, not a fixed one: it inspects the stream as it passes, so a longer answer pays more.
| Response length | Streamed events | disabled | audit | enforce |
|---|---|---|---|---|
| ~200 tokens (short answer, tool call) | ~200 | 0.05 vCPU-s | 0.06 vCPU-s | 0.07 vCPU-s |
| ~600 tokens (typical agent turn) | ~600 | 0.10 vCPU-s | 0.13 vCPU-s | 0.15 vCPU-s |
| ~1 000 tokens | ~1 000 | 0.16 vCPU-s | 0.20 vCPU-s | 0.23 vCPU-s |
| ~2 000 tokens (long code write) | ~2 000 | 0.30 vCPU-s | 0.38 vCPU-s | 0.43 vCPU-s |
Prompt size is close to free by comparison: a 150 KB prompt costs about the same as a 16 KB one, because the router parses a request once and does not re-read it.
enforce also adds a consistent ~11 ms to time-to-first-token — it releases
the stream in governed 512-character windows and holds back a 256-character tail
so a finding straddling a boundary is still caught. That cost is flat: it does
not grow with the length of the answer. audit adds no measurable TTFT, because
it inspects without holding anything back.
Sizing for a developer population
Size from turns per second, not from how many developers hold an account. A developer with an agent open is not streaming continuously — they read, edit, and think between turns. The fraction of time their tool is actually streaming is the duty cycle, and it is the number that decides your CPU.
For 1 000 developers issuing typical 600-token turns of roughly 15 seconds each:
Provisioned vCPU below is at a 65 % utilisation target, for all three DLP modes:
| Duty cycle | Concurrent streams | Turns/s | disabled | audit | enforce | Replicas |
|---|---|---|---|---|---|---|
| 10 % — occasional use | 100 | 6.7 | 1.1 vCPU | 1.3 vCPU | 1.5 vCPU | 2 |
| 25 % — steady coding-agent use | 250 | 16.7 | 2.6 vCPU | 3.3 vCPU | 3.8 vCPU | 4 |
| 50 % — heavy, agent-driven | 500 | 33.3 | 5.3 vCPU | 6.7 vCPU | 7.5 vCPU | 8 |
| 100 % — every developer streaming at once | 1 000 | 66.7 | 10.5 vCPU | 13.4 vCPU | 15.1 vCPU | 16 |
Turning DLP on costs roughly 25 % more CPU per turn in audit and 50 % in
enforce, on a typical agent turn. That is a real cost but rarely the deciding
one — the replica count below moves first.
The replica count is usually the binding number, not the vCPU total. Each
pod accepts auth.llmRouter.maxInFlight open turns (default 64), so the
minimum replica count is concurrent streams ÷ 64 regardless of how much CPU
headroom a pod has. At 250 concurrent streams that is 4 replicas holding about
3.5 vCPU between them — well under the 2000m limit each one is allowed. Raise
maxInFlight and the CPU limit together, or add replicas; do not raise one
alone.
Validating your own numbers
The figures above are a starting point, not a substitute for measuring your own traffic. Turn length, DLP posture, and how agent-heavy your developers are all move the result by more than the modelling error. Once traffic is real, the metrics on the AI Gateway capacity section tell you where you actually are:
scrydon_llm_router_streams_in_flightagainst yourmaxInFlight— how close a pod is to shedding.scrydon_llm_router_admission_rejections_total— sustained non-zero at steady state means add a replica, not client retries.scrydon_llm_router_overhead_msversusscrydon_llm_router_provider_ttfb_ms— separates time your platform spent from time the provider spent, so you can tell a capacity problem from a slow model.
A single organisation has a second ceiling, independent of CPU. Each turn
writes hash-chained audit evidence, and that evidence is ordered per
organisation — so one tenant's sustained turn rate is bounded by how fast its
audit chain commits, and adding replicas does not move it. Two audit writes per
turn, or four when DLP runs in enforce.
Our capacity suite measures that commit at 3-10 ms, which puts one organisation
somewhere between roughly 100 and 380 audit writes per second — comfortably
above every row in the table above except the last one under enforce. If you
are placing all 1 000 developers in one organisation and running DLP in
enforce and expecting them to stream simultaneously, validate that
combination before committing to it. Traffic spread across several
organisations does not share the ordering and is not affected.