Cloud Gaming Infrastructure: Per-Tenant Egress and Idle-Storage Cost at 56-Tenant Density
Video Walkthrough & Architecture Breakdown
The Challenge
Under standard 1:1 cloud provisioning, data egress alone cost $1.24/hr per tenant on AWS, before compute, before idle storage. Set against the per-tenant price incumbents on dedicated hardware fleets charge end users, the cost floor sat above the revenue ceiling.
Executive Summary
We architected a hyperscale cloud gaming infrastructure capable of competing with NVIDIA GeForce NOW, without requiring upfront capital expenditure, access to proprietary hardware, or a pre-existing user base.
The target deployment regions, the Middle East and Singapore, imposed latency requirements that ruled out decentralized compute markets. Under standard 1:1 provisioning on major hyperscalers, data egress and idle storage put the per-tenant cost floor above the per-tenant revenue ceiling: $1.24/hr in egress per tenant on AWS, before compute.
We resolved this by transitioning the compute topology to Oracle Cloud Infrastructure (OCI), exploiting its asymmetric egress pricing. We selected Linux with Proton as the game execution layer (eliminating Windows licensing overhead) and enforced a Bring Your Own Game (BYOG) licensing model via Steam OAuth verification. We decoupled game state at the kernel storage layer using OverlayFS, implemented an instant hot-swap orchestration framework, and designed a multi-tier compute scaling strategy spanning cost-optimized A10 nodes at startup to high-density BM.GPU.RTXPRO.8 bare-metal clusters at scale. This architecture brings per-tenant cost to $0.56/hr at startup scale and $0.65/hr at 56-tenant density, without upfront CapEx.
1. The Cost Floor
We audited three infrastructure models targeting the Middle East and Singapore. Each revealed a distinct failure mode that, while individually solvable, compounded into a catastrophic margin erosion rooted in the fundamental economics of cloud compute.
1.1 The 1:1 Cloud Provisioning Trap
The naive approach provisions a dedicated cloud GPU instance and a 1TB storage volume per user. The volume contains the game library, and a streaming stack (Sunshine, Proton, Wine) delivers the video feed. While this architecture is functionally correct, the unit economics are dead on arrival.
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Client ["Client Edge"]
Player["Client Application<br>(Moonlight Protocol • 1080p 60fps)"]:::prominent
end
subgraph Infrastructure ["Hyperscaler Cloud Architecture (1:1 Provisioning)"]
CloudGPU["Dedicated Cloud GPU Instance<br>(On-Demand/<br>Spot Compute)"]:::steel
UserDisk[("Dedicated Storage Volume<br>(1TB Block Storage per User)")]:::sage
StreamStack["Streaming Service Stack<br>(Sunshine / Proton / Wine)"]:::gold
EgressCost["Data Transfer Routing<br>(High Egress Volume)"]:::crimson
CloudGPU --> UserDisk
CloudGPU --> StreamStack
StreamStack --> EgressCost
end
Player -- "Standard Latency / High Cost Structure" --> Infrastructure
class Client,Infrastructure ghost
At standard hyperscaler rates (AWS), a 1080p 60fps stream generates continuous high-bandwidth egress. Per user, the cost structure decomposes to:
- Compute: ~$1.99/hr on-demand for a
g5.4xlargeGPU instance. - Storage: $9.60/mo per 100GB EBS volume (at minimum; a full game library volume costs significantly more).
- Egress: ~$1.24/hr per tenant in data transfer fees for the video stream alone.
The bandwidth costs exceed the compute overhead by over 300%. Giving each user a dedicated node and a dedicated storage volume generates an immediate OpEx liability that outpaces any viable consumer price point.
1.2 The P2P Compute Dead End
To optimize capital efficiency, we audited peer-to-peer compute networks. Platforms like Vast.ai offer bare-metal GPU nodes at a fraction of hyperscaler pricing, with rates as low as $0.058/hr for basic instances and ~$0.30/hr for AAA-capable GPUs.
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Client ["Client Edge"]
Player["Client Application<br>(Moonlight Protocol • 1080p 60fps)"]:::prominent
end
subgraph Infrastructure ["Decentralized P2P Compute Architecture"]
CheapHost["Leased Bare-Metal GPU Node<br>(Spot/P2P Market Pricing)"]:::steel
StreamStack["Streaming Service Stack<br>(Sunshine / Proton / Wine)"]:::gold
NetIssues["Network Topology Constraints<br>(Variable Stability)"]:::crimson
GeoIssues["Geographic Availability Limitations<br>(e.g., Middle East, APAC Gaps)"]:::crimson
CheapHost --> StreamStack
CheapHost --> NetIssues
CheapHost --> GeoIssues
end
Player -- "Variable Latency / Low Cost Structure" --> Infrastructure
class Client,Infrastructure ghost
However, this approach introduced three critical failure modes:
- Geographic Unavailability: The target regions (Middle East, Singapore) are consistently underserved on P2P compute markets. Reliable nodes in these locations are rarely available, and when they are, they are quickly rented by other customers.
- Machine Lock-in & Data Persistence: Games are persisted to the local disk of a specific machine. If that machine is rented by another customer between sessions, the next session cannot utilize it. Transferring multi-hundred-gigabyte game installations to a new node introduces significant delays and network costs.
- Network Instability: Despite fast internet connections, the variable network topology of P2P hosts introduces significantly noticeable timeouts, latency spikes, and connection drops during gameplay.
Conclusion: Cheap compute generates zero leverage if the network topology isolates the target user base. The cost savings are negated by the inability to guarantee consistent geographic availability and session continuity.
1.3 The Spot Instance Engineering Trap
A competent engineer's next attempt targets the compute cost via ephemeral Spot Instances. On AWS, Spot discounts of 35-45% reduce a g5.4xlarge instance from ~$1.99/hr to ~$1.30/hr, yielding a per-tenant compute cost of ~$0.40/hr when grouping 3 tenants per node. However, Spot instances can be terminated with only a 2-minute warning, requiring a ruthless orchestration layer.
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Client ["Client Edge"]
T1(("Tenant 1")):::prominent
T2(("Tenant 2")):::prominent
T3(("Tenant 3")):::prominent
end
subgraph AWS ["AWS Infrastructure (Instant Hot-Swap Architecture)"]
S3[("Amazon S3<br>Game Library & Saves")]:::sage
Orchestrator["Tiny VM Orchestrator<br>(Lifecycle Management)"]:::steel
EBS[("EBS gp3 NVMe<br>Game, OS, Software")]:::sage
subgraph SpotNode ["g5.4xlarge Spot Instance"]
Wine["Linux Host / Proton + Sunshine<br>(Streaming Stack)"]:::gold
end
S3 -->|"1. Transfer Data on Demand"| EBS
EBS --- SpotNode
SpotNode -->|"3. 2-Min Warning: Slam state/saves to cloud"| S3
Orchestrator -->|"2. Provision replacement node on warning"| SpotNode
end
T1 -->|"Play Session"| Wine
T2 -->|"Play Session"| Wine
T3 -->|"Play Session"| Wine
class Client,AWS ghost
class SpotNode ghost
The Instant Hot-Swap Method
To survive Spot terminations, we designed an instant hot-swap orchestration process that must execute within the 2-minute termination window:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
Signal["⚠️ 2-Minute Termination Warning Received"]:::crimson
subgraph DyingNode ["Active Spot Instance (Terminating)"]
ForceSave["1. Slam Quick Save<br>(AutoHotkey / Script Injection)"]:::gold
Upload["2. Upload State<br>(Push save files to S3)"]:::sage
end
subgraph ControlPlane ["Control Plane"]
Orchestrator["Tiny VM Orchestrator"]:::steel
Provision["3. Provision Replacement Instance<br>& Attach existing EBS gp3 Volume"]:::steel
end
subgraph CloudStorage ["Persistent Cloud Storage"]
ObjStore[("Object Storage<br>(S3 / Cloud Saves)")]:::sage
end
subgraph NewNode ["Replacement Spot Instance (Active)"]
Download["4. Restore State<br>(Pull saves from S3)"]:::sage
Resume["5. Resume Play<br>(Auto-load save via CLI/Macros)"]:::prominent
end
%% Flow of events
Signal --> ForceSave
Signal --> Orchestrator
ForceSave --> Upload
Upload --> ObjStore
Orchestrator --> Provision
Provision --> Download
ObjStore --> Download
Download --> Resume
class DyingNode,ControlPlane,CloudStorage,NewNode ghost
The process leverages EBS gp3 volumes, which operate over NVMe-over-Fabrics with a dedicated PCIe lane to the node, separate from the node's primary network interface. This means EBS I/O does not compete with the game stream's network bandwidth. The gp3 IOPS can be dynamically increased for faster game loading, and volumes can be detached and reattached to replacement instances.
The hot-swap orchestration works. The cost per tenant it runs on does not clear the revenue per tenant:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Compute ["Compute Allocation (Structurally Viable)"]
Node["g5.4xlarge Instance<br>Base Price: ~$1.99/hr"]:::steel
Spot["Spot Instance Discount<br>(35% - 45% Reduction)"]:::sage
EffectiveCost["Effective Node Cost<br>~$1.30/hr"]:::gold
TenantCompute["Per-Tenant Compute<br>~$0.40/hr (3 Tenants grouped per node)"]:::gold
Node --> Spot --> EffectiveCost --> TenantCompute
end
subgraph Traps ["The Deal Breakers (Architectural Fatalities)"]
Egress["Data Transfer Egress<br>~$1.24/hr per Tenant"]:::crimson
Storage["EBS Persistent Storage<br>~$9.60/mo per Volume"]:::crimson
end
Result["Broken Unit Economics<br>(Bandwidth costs exceed compute overhead by >300%, negating all Spot savings)"]:::prominent
TenantCompute --> Result
Egress --> Result
Storage --> Result
class Compute,Traps ghost
Even with Spot-optimized compute at $0.40/hr per tenant, the data transfer egress ($1.24/hr per tenant) and persistent EBS storage costs destroy profitability. The total per-tenant cost lands at $1.27/hr, making the model unviable.
Beyond raw costs, the hot-swap strategy introduces additional structural vulnerabilities specific to the target regions:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Core ["AWS Hot Swap Strategy"]
Mechanism["Hot Swap Orchestration<br>(EBS Detach/Attach + State Sync)"]:::prominent
end
subgraph ComputeLimits ["Compute & Geographic Vulnerabilities"]
GeoConstraints["Regional Capacity Constraints<br>(Smaller AWS Datacenter Footprints in ME / SG)"]:::crimson
SpotTimeout["Orchestration SLA Failure<br>(Inability to locate/provision Spot VM replacement within 2 min limit)"]:::crimson
GeoConstraints --> SpotTimeout
end
subgraph StorageLimits ["Storage Constraints & Economic Traps"]
IdleEBS["Idle Infrastructure Expenditure<br>(Redundant continuous billing for EBS volumes during zero-tenant periods)"]:::crimson
AttachLimits["EBS 1:1 Attachment Constraint<br>(Scaling for more tenants requires new dedicated EBS volumes & on-the-fly game fetches)"]:::crimson
MultiAttach["Multi-Attach Volume Risks<br>(Introduces latency & data corruption due to multi-node state tracking)"]:::crimson
DataTransfer["Prohibitive Data Transfer Costs<br>(Massive Ingress/Egress network charges generated by on-the-fly object storage fetches)"]:::crimson
AttachLimits --> MultiAttach
AttachLimits --> DataTransfer
end
Mechanism --> ComputeLimits
Mechanism --> IdleEBS
Mechanism --> AttachLimits
class Core,ComputeLimits,StorageLimits ghost
AWS datacenters in the Middle East and Singapore have smaller Spot pools, increasing the probability that a replacement instance cannot be provisioned within the 2-minute window, resulting in a hard session drop. EBS volumes are billed continuously even during zero-tenant idle periods. And EBS's 1:1 attachment model means scaling multi-tenancy requires either duplicating volumes (multiplying storage costs) or fetching games on-the-fly from S3 (introducing prohibitive data transfer charges).
Conclusion: The engineering is sound. The financial architecture is not. A new architectural equilibrium was required.
2. The Architectural Transition
2.1 Infrastructure Arbitrage: OCI Selection
To compete with giants, we don't optimize code; we exploit infrastructure pricing models. We resolved the egress vulnerability by transitioning the network topology to Oracle Cloud Infrastructure (OCI), which offers a fundamentally different cost structure:
- Egress: The first 10TB of outbound data transfer per month is free. Beyond that, OCI egress rates are a fraction of AWS pricing.
- Internal VCN Traffic: Unmetered. No inter-availability-domain transfer fees.
- Block Storage: Significantly lower per-GB pricing with high-performance tiers.
The economic impact is immediate and decisive:
| Cost Element (Per Month) | AWS g5.4xlarge (3 Tenants) | OCI VM.GPU3.1 (2 Tenants) | OCI VM.GPU.A10.1 (4 Tenants) |
|---|---|---|---|
| Compute Cost | $949.00 | $1,097.40 | $1,488.00 |
| Egress Cost | $1,725.35 | $101.07 | $101.07 |
| Storage Cost | $120.00 | $50.00 | $50.00 |
| Total Cost / Instance | $2,794.35 | $1,248.47 | $1,639.07 |
| Max Concurrent Tenants | 3 Users | 2 Users | 4 Users |
| Total Tenant Hours / Month | 2,190 Hours | 1,460 Hours | 2,920 Hours |
| True Cost Per Tenant Hour | $1.27 / hour | $0.86 / hour | $0.56 / hour |
Note: Computations assume 100% utilization to determine baseline operational costs. Real-world costs are managed via the idle cost management strategy detailed in Section 2.4.
The OCI V100 (VM.GPU3.1) served as our initial cost validation, proving the economics at $0.86/hr per tenant. We then progressed to A10 GPU nodes for production, which support modern rendering features (DLSS, Ray Tracing) and higher tenant density (4-5 tenants per GPU), driving the cost to $0.56/hr.
2.2 Platform & Software Stack
A critical architectural decision was the selection of the game execution layer. The industry standard for cloud gaming is hardware virtualization via VFIO/QEMU, passing a physical GPU directly to a Windows guest VM. We rejected this approach in favor of API translation via Linux + Proton.
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Client ["Client Edge"]
Player["Client Application<br>(Moonlight Protocol • 1080p 60fps)"]:::prominent
end
subgraph VFIO ["Hardware Virtualization (VFIO QEMU/KVM)"]
Hypervisor["QEMU / KVM Hypervisor<br>(Host Linux Kernel)"]:::steel
VFIO_PCI["VFIO PCIe Passthrough<br>(1:1 GPU Allocation)"]:::sage
GuestOS["Guest Operating System<br>(Strict Hardware Isolation)"]:::gold
App_VFIO["Target Application / Game"]:::gold
Hypervisor --> VFIO_PCI
VFIO_PCI --> GuestOS
GuestOS --> App_VFIO
end
subgraph Proton ["API Translation (Proton / Wine)"]
LinuxHost["Linux Host Operating System<br>(Shared Kernel Resources)"]:::steel
Isolation["System Isolation Capability<br>(Namespaces, cgroups, Containers)"]:::sage
Translation["Translation Layer<br>(Proton / Wine / DXVK)"]:::gold
App_Proton["Target Application / Game"]:::gold
LinuxHost --> Isolation
Isolation --> Translation
Translation --> App_Proton
end
Player -- "Dedicated Resource Overhead" --> VFIO
Player -- "Flexible Allocation / Shared Resources" --> Proton
class Client,VFIO,Proton ghost
Why Proton wins for multi-tenant cloud gaming:
- Shared Kernel Resources: VFIO passthrough allocates one physical GPU per VM in a 1:1 binding. Linux + Proton runs games in userspace via DXVK (DirectX-to-Vulkan translation), allowing the host kernel to share GPU compute across multiple tenant processes. This is the foundation of our multi-tenant density model.
- Zero Windows Licensing: Eliminating Windows Server licensing removes a significant per-node cost and avoids licensing complexity entirely.
- Customizability: Full control over the host operating system enables kernel-level storage optimizations (OverlayFS), resource isolation (cgroups, namespaces), and automated game management that would be impossible inside a locked-down Windows guest.
Streaming Protocol: We use Moonlight (client) + Sunshine (server) for the game stream. Sunshine runs on the Linux host, encoding the game video output via the GPU's hardware NVENC encoder and streaming it to the Moonlight client over the network.
Licensing Model (BYOG): Purchased or pirated game copies cannot be legally distributed to users. We enforce a strict Bring Your Own Game model. Users authenticate via Steam OAuth. Through Steam's API, we verify the user's library and game licenses. If the user does not own the game, they cannot play it. The authentication flow is non-negotiable for legal viability.
Game Delivery: To prevent lengthy downloads, each node mounts a read-only drive containing pre-installed game data. This drive includes both the game files and the necessary Steam appmanifest files, allowing Steam to instantly recognize the game as "installed" without any download or verification step.
2.3 Shared Storage & OverlayFS Architecture
With egress costs neutralized via OCI and the software stack defined, we architected the core storage innovation: a shared, read-only block volume with per-tenant OverlayFS write isolation.
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Client ["Client Edge (Solved Egress: OCI 10TB/mo Free Tier)"]
T1(("Tenant 1")):::prominent
T2(("Tenant 2")):::prominent
T3(("Tenant 3")):::prominent
T4(("Tenant 4")):::prominent
end
subgraph OCI ["Oracle Cloud Infrastructure (Final Optimized Architecture)"]
ObjStore[("OCI Object Storage<br>(Idle State Backups)")]:::sage
SharedVol[("Shared Block Storage (1.5TB)<br>(Read-Only Shareable / Multi-Attach)")]:::prominent
ObjStore -- "1. Warmup: Mount & Sequential Read to SSD" --> SharedVol
SharedVol -- "4. Idle: Backup to Object Storage" --> ObjStore
subgraph Node1 ["VM.GPU3.1 Preemptible Node 1"]
Overlay1[("Small Local Block<br>(OverlayFS Upperdir)")]:::gold
Wine1["Linux / Proton + Sunshine<br>(Streaming Stack)"]:::steel
Wine1 -- "3. Write saves/state" --> Overlay1
Wine1 -- "2. Read game files" --> SharedVol
end
subgraph Node2 ["VM.GPU3.1 Preemptible Node 2"]
Overlay2[("Small Local Block<br>(OverlayFS Upperdir)")]:::gold
Wine2["Linux / Proton + Sunshine<br>(Streaming Stack)"]:::steel
Wine2 -- "3. Write saves/state" --> Overlay2
Wine2 -- "2. Read game files" --> SharedVol
end
SharedVol -. "Supports up to 8 Nodes<br>(Resolves AWS 1:1 Storage Constraint)" .-> NodeN["... Nodes 3 to 8"]:::ghost
end
T1 -- "Play Session" --> Wine1
T2 -- "Play Session" --> Wine1
T3 -- "Play Session" --> Wine2
T4 -- "Play Session" --> Wine2
class Client,OCI,Node1,Node2 ghost
Implementation
We deployed a single 1.5TB, 120 VPU (Volume Performance Units) high-speed block volume on OCI, containing the full game library, operating system, and streaming software. This volume is attached as read-only and shareable across multiple compute nodes.
The problem with standard multi-attach block storage is that multiple nodes writing stateful files to the same volume creates competing state tracking, introducing systemic data corruption. We resolved this via OverlayFS at the Linux kernel level:
- Lowerdir (Read-Only): The shared 1.5TB volume is mounted as the OverlayFS
lowerdir. All game data reads come from this shared volume. - Upperdir (Writable): On each compute node, a separate, small (~20GB per tenant), cost-optimized block volume serves as the OverlayFS
upperdir. Any file modifications (save games, configuration changes, shader caches) are captured here. - Merged View: Proton and Sunshine see a unified, writable filesystem. They read massive game data from the shared volume and write tenant-specific state to the isolated local volume.
Scaling Constraint: OCI allows up to 8 instances to operate from a single shared block volume. To scale beyond 8 nodes, we create storage replicas. At peak density with BM.GPU.RTXPRO.8 nodes (56 tenants per node), a single shared volume supports up to 448 concurrent tenants (8 nodes × 56 tenants).
The Network Throughput Paradox
At 448 concurrent tenants sharing a single block volume, a theoretical throughput concern emerges. The OCI Ultra High Performance volume outputs a maximum of 2,680 MB/s. Divided across 448 tenants, this yields only ~6 MB/s per tenant, far below the 200-500 MB/s burst reads that AAA games require for asset loading. This calculation suggests catastrophic failure.
In practice, the Linux kernel's Page Cache resolves this entirely:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph TheMath ["The Theoretical Bottleneck (Raw Math)"]
Pipe["OCI Ultra High Performance Volume<br>(Max Throughput: 2680 MB/s)"]:::steel
Tenants["448 Concurrent Tenants"]:::crimson
Math["2680 MB/s ÷ 448 = ~5.98 MB/s per Tenant"]:::crimson
Panic["Catastrophic Failure<br>(AAA games require 200-500 MB/s bursts; 6 MB/s causes stutter/crashes)"]:::crimson
Pipe --> Tenants --> Math --> Panic
end
subgraph TheSavior ["The Real-World Solution (Linux Page Cache)"]
NVMeOF["NVMe-oF Backend (OCI SmartNIC)<br>(Sub-millisecond latency; maps directly to PCIe bus)"]:::sage
FirstRead["1. The First Read (Network Hit)<br>Tenant 1 loads Game X (Uses Network Pipe)"]:::gold
RAMCache["Linux Page Cache (Node RAM)<br>(Files cached in memory at 50+ GB/s)"]:::prominent
SubsequentReads["2. Subsequent Reads (RAM Hit)<br>Tenants 2-56 load Game X (Bypasses Network Pipe entirely)"]:::gold
NVMeOF --> FirstRead --> RAMCache --> SubsequentReads
end
subgraph TheDanger ["The Edge Case (Cache Thrashing)"]
Fragmentation["High Fragmentation<br>(56 tenants play 56 massive, different games)"]:::steel
Eviction["RAM Fills / Cache Eviction<br>(System forced to fetch assets over network)"]:::crimson
Thrashing["Network Thrashing<br>(Defaults back to the 5.98 MB/s catastrophic bottleneck)"]:::crimson
Fragmentation --> Eviction --> Thrashing
end
Panic -. "Mitigated by OS Architecture" .-> NVMeOF
SubsequentReads -. "Breaks if..." .-> Fragmentation
class TheMath,TheSavior,TheDanger ghost
OCI block volumes operate over NVMe-over-Fabrics via SmartNIC hardware with sub-millisecond latency. When the first tenant loads a game, the files are read from the network volume and cached in the node's RAM by the Linux Page Cache. When subsequent tenants load the same game, the reads are served entirely from RAM at 50+ GB/s, bypassing the network pipe completely.
The edge case is cache thrashing: if 56 tenants on a single node each play 56 different massive games, the RAM fills and the cache evicts assets, forcing network reads. In practice, cloud gaming services exhibit strong title concentration (popular games dominate), and the orchestrator can group tenants playing the same title onto the same node to maximize cache hit rates.
2.4 Cold-Start Elimination & Idle Cost Management
NVIDIA GeForce NOW has an inherent competitive advantage: their massive user base ensures hardware is rarely idle. A startup service will experience significant idle periods, and paying for active block storage during zero-tenant windows is financially unsustainable.
We engineered a three-phase storage lifecycle that transitions between active, warm, and cold states:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph IdlePhase ["Phase 1: Zero-Tenant Idle State (Cost Optimization)"]
ObjStore[("OCI Object Storage<br>(Master Backup Repository • ~$0.05/hr)")]:::sage
TearDown["Compute & Active Block Volumes Terminated<br>(Eliminates ~$0.48/hr idle burn)"]:::steel
TearDown -. "Retains State" .-> ObjStore
end
subgraph WarmupPhase ["Phase 2: Predictive / On-Demand Warm-up"]
RestoredVol[("Restored Block Volume<br>(Vulnerable to Lazy-Loading Network Latency)")]:::crimson
SeqRead["Sequential Read Execution<br>(e.g., tar -cf /dev/null /mnt/games/target)"]:::prominent
ReadyVol[("Fully Cached Physical SSD<br>(Eliminates in-game network fetch latency)")]:::sage
ObjStore -- "1. Restore Volume on Tenant Demand" --> RestoredVol
RestoredVol -- "2. Force Max-Speed Cache Fetch" --> SeqRead
SeqRead -- "3. Commit Target Game to SSD" --> ReadyVol
end
subgraph ActivePhase ["Phase 3: Active OverlayFS Architecture (Supports 1 to 8 Nodes)"]
SharedLower[("High-Performance Shared Volume (1.5TB)<br>(Read-Only Lowerdir)")]:::gold
LocalUpper[("Cheap Small Local Block Volume<br>(Writable Upperdir)")]:::steel
OverlayFS["OverlayFS Controller<br>(Merges R/O Library + Writable State)"]:::prominent
GPUApp["Streaming Stack & Game Runtime<br>(Sees unified writable filesystem)"]:::gold
ReadyVol -. "4. Mounts As" .-> SharedLower
SharedLower -- "Reads Massive Game Data" --> OverlayFS
OverlayFS -- "Isolates Saves & Configs" --> LocalUpper
OverlayFS --- GPUApp
end
class IdlePhase,WarmupPhase,ActivePhase ghost
Phase 1 (Idle State): When the tenant count drops to zero, we tear down all compute instances and the active block volume, leaving only the master backup in OCI Object Storage. This reduces idle costs from ~$0.48/hr to ~$0.05/hr, a 90% reduction in idle burn.
Phase 2 (Warm-up): When a tenant requests a session, we restore the block volume from the Object Storage backup. However, a restored volume does not physically contain the files on SSD; it only holds metadata pointers to the network-backed Object Storage. Reading files triggers lazy-loading over the network, introducing massive latency that manifests as severe in-game lagging.
We resolve this by injecting a sequential read execution command immediately upon mounting:
tar -cf /dev/null /mnt/games/cyberpunk2077
This commands the OS to sequentially read the entire game directory from the network pipe at maximum speed, caching the files onto the local SSD. The output is discarded to /dev/null, the objective being solely to populate the SSD cache. Once cached, the files are ready for read-only operation by tenants without in-game network latency.
Optimization: Rather than warming the entire 1.5TB volume (which contains many games), we provision/warm only the requested game from the backup, minimizing the network pull and accelerating time-to-play. Pre-warming can also be triggered predictively based on the peak hours algorithm (Section 3.2).
Phase 3 (Active): The warmed volume mounts as the read-only shared lowerdir, and the OverlayFS architecture operates as described in Section 2.3.
2.5 Compute Tiering & Dynamic Scaling
Selecting the correct compute tier is critical to avoiding early-stage margin erosion. Deploying a high-density BM.GPU.RTXPRO.8 node (capable of 56 concurrent tenants) during a low-traffic startup period guarantees severe underutilization and broken unit economics.
We implemented a three-tier compute scaling strategy using OCI A10 GPU nodes, dynamically selecting the optimal instance type based on real-time traffic volume:
| Instance Type | GPU Configuration | Concurrent Tenants | Use Case |
|---|---|---|---|
VM.GPU.A10.1 |
1x A10 (24GB VRAM) | 4-5 Tenants | Low traffic / Startup |
VM.GPU.A10.2 |
2x A10 (48GB VRAM) | 8-10 Tenants | Moderate traffic |
BM.GPU.A10.4 |
4x A10 (96GB VRAM) | 16-20 Tenants | Peak traffic (Bare Metal) |
Advance Provisioning Threshold: To prevent out-of-capacity errors and wait times, instances are provisioned in advance based on a strict threshold. If a GPU supports 5 tenants, a new node is automatically spun up the moment the 4th tenant connects. The 5th tenant fills the existing node; the 6th tenant is seamlessly routed to the freshly provisioned node.
Storage Efficiency at Scale: Utilizing larger, multi-GPU nodes during high demand maximizes tenant density per machine. This reduces the total number of nodes a read-only shared block volume must be attached to, ensuring that higher demand results in cheaper storage costs per tenant (more tenants share fewer volume attachments).
As traffic scales beyond A10 capacity, the orchestrator synthesizes a forced state-save and seamlessly migrates active users to high-density BM.GPU.RTXPRO.8 nodes:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Trap ["Early-Stage Capacity Vulnerability"]
BigNode["BM.GPU.RTXPRO.8 Node<br>(High Capacity: 56 Tenants)"]:::steel
EmptySlots["Low Startup Traffic<br>(Severe Underutilization)"]:::crimson
BrokenEcon["Broken Unit Economics<br>(Subsidizing empty GPU slots)"]:::crimson
BigNode --> EmptySlots --> BrokenEcon
end
subgraph Startup ["Phase 1: Right-Sized Startup Architecture"]
SmallNode["Cost-Optimized A10 Node (VM.GPU.A10.1)<br>(Capacity: 4 Tenants • AA Titles)"]:::sage
ViableEcon["Compliant Unit Economics<br>(~$0.56 - $0.60/hr compute per tenant)"]:::gold
SmallNode --> ViableEcon
end
subgraph Scaling ["Phase 2: Dynamic Migration via Hot Swap"]
TrafficSpike["Traffic / Concurrency Increases<br>(A10 Nodes reaching aggregate limits)"]:::steel
HotSwap["Instant Hot Swap Strategy<br>(Seamlessly capture state & redirect clients)"]:::prominent
DenseNode["Consolidate to High-Density Node<br>(Migrate to BM.GPU.RTXPRO.8)"]:::sage
SustainedEcon["Sustained Unit Economics<br>(Maximized density as traffic peaks)"]:::gold
TrafficSpike --> HotSwap --> DenseNode --> SustainedEcon
end
BrokenEcon -. "Strategic Pivot" .-> Startup
ViableEcon --> TrafficSpike
class Trap,Startup,Scaling ghost
This ensures we never subsidize empty GPU slots. Unit economics remain compliant at every traffic level.
2.6 Hot-Swap Orchestration & Disaster Recovery
Although the final OCI architecture uses on-demand A10 nodes (not Spot instances), the hot-swap methodology from the AWS iteration remains critical for two scenarios: viral traffic spikes requiring rapid node migration, and disaster recovery when a node crashes unexpectedly.
Hardware Alignment: Because we standardize on the A10 architecture across all compute tiers, moving a user from one node to another (or one region to another) is predictable and deterministic. The underlying hardware aligns perfectly, eliminating compatibility risks during migration.
Session State Transfer: When a hot-swap is triggered, we rapidly transfer:
- Steam
ssfnsession files to bypass Steam Guard re-authentication on the new node. - OverlayFS upperdir contents (save games, shader caches, configuration files) to the new node's local block volume.
- Client redirect command via the orchestrator, seamlessly pointing the Moonlight client to the new node's IP.
The interruption window is kept minimal and the user experience remains seamless.
3. Capacity & Operational Resilience
Handling capacity limits gracefully is critical to maintaining a positive user experience, especially during unexpected demand spikes or node failures.
3.1 Failover Buffer & Instant Transfer
We maintain a strict 95% capacity headroom buffer across the node fleet. This reserves 5% of compute capacity exclusively for emergency failovers. When a node unexpectedly goes down, affected users are instantly transferred to the available failover headroom nodes without dropping the active session. The hot-swap process (Section 2.6) executes automatically.
3.2 Predictive Scaling
A peak hours algorithm determines expected demand spikes based on historical usage data, regional time zones, and cultural patterns (e.g., gaming peaks after work/school hours, weekends, game launch events). Nodes are proactively provisioned in advance of predicted spikes, ensuring capacity is available before users log in.
This same predictive engine drives the storage warm-up process (Section 2.4): volumes can be pre-warmed from Object Storage before peak hours, eliminating cold-start delays entirely for the first users of the day.
3.3 Geo Bursting
When regional capacity reaches 100% (all local and acceptable nodes are full), users are given a choice:
- Wait in the local queue for a spot to open up.
- Geo Burst: Connect immediately to a nearby server in a different region for instant play, with a clear warning that they may experience slightly higher latency.
This transforms a hard capacity wall into a soft degradation, preserving user engagement.
3.4 Stream Squeezing (Last Resort)
If the queue becomes unmanageable and all failover and geo-burst options are exhausted, we implement dynamic stream squeezing:
- We downgrade the stream resolution of existing tenants (e.g., from 1080p to 720p) to free up compute and bandwidth headroom on the node.
- Targeting: This downgrade is selectively applied to users whose client-side limitations (e.g., slow internet connection, high packet loss) mean they are least likely to notice the reduction in visual quality.
- The freed resources are used to "squeeze" a new tenant onto the existing node, maintaining service availability at the cost of marginal quality reduction for already-constrained users.
4. Multi-Tenant Isolation & Game Compatibility
Running multiple game instances on a single GPU requires strict resource isolation to prevent noisy-neighbor interference. Without hard limits, a single tenant can destabilize every other session on the node.
4.1 Tenant Capacity Heuristics
Determining the true tenant capacity of a node requires a non-obvious testing methodology. Naive benchmarking yields false results:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Naive ["The Naive Testing Trap (Unconstrained)"]
Unconstrained["Unconstrained Execution<br>(Running game freely on massive multi-tenant node)"]:::steel
GreedyCache["Greedy Engine Caching<br>(Game dynamically claims all free RAM/VRAM)"]:::crimson
FalseLimit["False Capacity Ceiling<br>(Telemetry falsely suggests node maxes out at 2-3 tenants)"]:::crimson
Unconstrained --> GreedyCache --> FalseLimit
end
subgraph Strategic ["Heuristic Slicing Methodology (Strict Isolation)"]
Isolate["Strict Resource Isolation<br>(Enforce hard limits on compute, VRAM, and memory)"]:::sage
Heuristic["Iterative Slice Reduction<br>(Gradually cut the resource slice while monitoring FPS/frame times)"]:::gold
EngineBehavior["Forced Engine Optimization<br>(Prevents lazy caching; forces game engine to strategically manage limited resources)"]:::prominent
Isolate --> Heuristic --> EngineBehavior
end
subgraph Outcome ["Optimized Unit Economics"]
MaxDensity["Maximized Node Density<br>(Unlocks true capacity, e.g., 56 tenants per node)"]:::sage
end
FalseLimit -. "Necessitates alternative approach" .-> Isolate
EngineBehavior --> MaxDensity
class Naive,Strategic,Outcome ghost
When a game runs unconstrained on a powerful multi-GPU node, game engines greedily claim all available RAM and VRAM for caching (pre-loading textures, shader compilation, asset streaming). Benchmarking under these conditions falsely suggests the node can only support 2-3 tenants.
The correct approach is heuristic slicing: enforce hard resource limits per tenant first, then iteratively reduce the resource slice while monitoring FPS and frame times. Game engines are designed to adapt to constrained environments. When told they only have 5GB of VRAM, they strategically manage resources rather than lazily caching. This unlocks the true capacity ceiling.
4.2 VRAM Hard Caps & System-Wide FSR
Two critical environment variables enforce tenant isolation and optimize GPU utilization:
-
VRAM Hard Caps: The environment variable
WINE_VIRTUAL_VIDEOMEMORY=7168(for a 7GB cap) is set in each tenant's launch script. This tricks the game engine into thinking it only has access to a constrained VRAM allocation, preventing Tenant 1 from spiking graphics settings and causing Tenant 2's game to crash with an Out-of-Memory (OOM) error. -
System-Wide FSR Upscaling: Since DLSS requires dedicated Tensor Cores (unavailable on V100 architecture), we substitute AMD's FidelityFX Super Resolution (FSR) via Proton's built-in system-wide upscaler. By adding
WINE_FULLSCREEN_FSR=1to game launch arguments, the game renders at a lower internal resolution (e.g., 720p) and cleanly upscales to 1080p before Sunshine encodes the stream. This dramatically reduces the GPU compute load per tenant, enabling higher density on shared hardware.
On modern A10 and RTXPRO architectures, DLSS is available natively, further improving visual quality at reduced compute cost.
4.3 Game Compatibility Tiers
Not all games are compatible with the Linux + Proton stack. We categorize supported titles into three tiers based on VRAM consumption, anti-cheat compatibility, and achievable tenant density:
| Tier | Density | Representative Titles | Notes |
|---|---|---|---|
| Tier 1: Esports | 3+ Tenants (~5GB VRAM each) | GTA V, Overwatch 2, Apex Legends, CS2, Rocket League, Dota 2 | Ran under Proton/DXVK with no compatibility failures observed in testing. CPU-bound titles use OCI's high-frequency compute cores. |
| Tier 2: AAA | 2 Tenants (~7.5GB VRAM each) | Elden Ring, Cyberpunk 2077, Baldur's Gate 3, Red Dead Redemption 2, Helldivers 2 | Ray Tracing off, FSR Quality mode enabled. Vulkan executables preferred over DX12 translation. |
| Tier 3: Blocked | N/A | Valorant, Fortnite, Call of Duty: Warzone, PUBG | Kernel-level anti-cheat (Vanguard, Ricochet, BattlEye) explicitly blocks Linux, Proton, or VM execution. |
Tier 3 games are hard-blocked at the platform level with clear user-facing warnings. This is a technical wall imposed by the anti-cheat vendors, not a limitation of the architecture.
4.4 Security & Anti-Abuse
Multi-tenant GPU infrastructure is a high-value target for abuse. We enforce the following security controls:
- Token Security: Steam authentication tokens and
ssfnsession files are strictly encrypted at rest and held only in in-memory buffers during execution. Tokens are never written to persistent storage. - Tenant Isolation: Strict isolation boundaries via Linux containers, namespaces, and cgroups ensure one tenant's environment cannot access or impact another's on shared nodes.
- Egress Lockdown: Network egress from tenant containers is locked down to only allow streaming traffic (Moonlight/Sunshine protocol) and essential Steam API calls. All other outbound connections are blocked.
- Active Monitoring: Background worker processes continuously monitor CPU/GPU utilization heuristics and network patterns to immediately detect and terminate abuse, such as cryptocurrency mining or unauthorized network scanning.
5. Client Architecture & User Experience
5.1 Client Application Stack
The client application must provide a seamless wrapper around the Moonlight stream, handling authentication, session management, and UI interventions that the stock Moonlight client cannot support.
- Desktop Application: A Tauri application (Rust backend, web frontend) or a custom fork of the Moonlight client handles stream wrapping and UI interventions. It monitors the Moonlight stream, takes over the screen for foreground processes (e.g., displaying UI during a hot-swap migration or showing the remaining session timer), and reliably blocks access to the underlying OS desktop, locking the user into the game/service environment.
- Web Authentication: A React-based web application handles initial onboarding, the user dashboard, game library management, and the Steam OAuth authentication flow.
- TV & Mobile Apps: Native development is mandatory for platforms like Android TV, Apple TV, and mobile devices. Browsers are fundamentally unsuited for competitive cloud gaming: input processing through a browser requires multiple event loop hops before being registered by the stream, introducing unacceptable input latency. Dedicated native applications are required to ensure ultra-low latency and the best possible user experience.
5.2 Queue User Experience
When all capacity is exhausted and users must wait, the queue experience must be engaging rather than frustrating:
- Time-Based Estimation: Display an estimated wait time (e.g., "Expected wait: 3 mins") rather than a static queue number (e.g., "You are 453rd in line"). Time-based estimates are psychologically easier to tolerate and provide actionable information.
- Interactive Loading Screens: Playable mini-games integrated directly into the loading screen, along with relevant content such as game patch notes, tips, special promotional codes, and highlights from popular streamers.
6. The Business ROI
6.1 Unit Economics at Scale
We transitioned a structurally fatal model into a highly profitable operation. The final architecture on the BM.GPU.RTXPRO.8 bare-metal node achieves the following unit economics:
graph TD
%% ── Dark Elegant Theme ─────────────────────────────────
classDef gold fill:#1f1c15,stroke:#c8a96e,stroke-width:1.5px,color:#e8d5a8
classDef sage fill:#131a14,stroke:#7a9e7e,stroke-width:1px,color:#a8c8ac
classDef steel fill:#131620,stroke:#8896a8,stroke-width:1px,color:#b0bece
classDef crimson fill:#1a1212,stroke:#a87878,stroke-width:1px,color:#d4a0a0
classDef ghost fill:#111110,stroke:#2a2926,stroke-width:1px,color:#6a6860,stroke-dasharray:4 3
classDef prominent fill:#c8a96e,stroke:#c8a96e,color:#1a1508,font-weight:600
subgraph Compute ["Compute Tier: High-Density Uninterruptible (BM.GPU.RTXPRO.8)"]
Node["Bare Metal Node (On-Demand)<br>(8x RTX GPUs • 96GB VRAM per GPU)"]:::steel
Density["High Density Allocation<br>(~56 Concurrent AAA Tenants per Node)"]:::sage
ComputeCost["Compute Unit Cost<br>(~$0.60 - $0.70/hr per Tenant)"]:::gold
Node --> Density
Density --> ComputeCost
end
subgraph Storage ["Storage Tier: Multi-Attach OverlayFS Unit Economics"]
SharedDrive["Read-Only Master Volume<br>($350/mo • Shared across 8 Nodes / 448 Tenants)"]:::steel
SharedCost["Master Storage Unit Cost<br>(~$0.78/mo per Tenant)"]:::sage
LocalDrive["Local Writable State Volume (Upperdir)<br>(1120GB for 56 Tenants • $47.60/mo per Node)"]:::steel
LocalCost["State Storage Unit Cost<br>(~20GB per Tenant = ~$0.85/mo per Tenant)"]:::sage
SharedDrive --> SharedCost
LocalDrive --> LocalCost
end
subgraph Value ["End-User Experience & Final Architecture Viability"]
UX["Premium Uninterrupted Gameplay<br>(AAA Titles • Ray Tracing • DLSS • Med/High Settings)"]:::prominent
FinalCost["Final Operational Unit Economics per Tenant<br>Compute: ~$0.65/hr<br>Storage: ~$1.63/mo"]:::prominent
end
ComputeCost --> FinalCost
SharedCost --> FinalCost
LocalCost --> FinalCost
Node -. "Ensures no spot interruptions" .-> UX
UX --> FinalCost
class Compute,Storage,Value ghost
- Compute: ~$0.65/hr per tenant (on-demand, uninterruptible, no Spot risk).
- Master Storage: ~$0.78/mo per tenant (shared 1.5TB read-only volume amortized across 448 tenants).
- State Storage: ~$0.85/mo per tenant (~20GB OverlayFS upperdir).
- Total Storage: ~$1.63/mo per tenant.
6.2 8-GPU Scaling Considerations
The BM.GPU.RTXPRO.8 represents the peak density target: 8x NVIDIA RTX PRO 6000 Blackwell GPUs with 768 GB of total VRAM and 32 dedicated NVENC encoding engines. However, scaling is not perfectly linear. While GPU resources multiply by 8, CPU resources (144 cores / 288 threads) remain constant, introducing a CPU starvation bottleneck:
| Game Tier | Concurrent Capacity | Primary Bottleneck |
|---|---|---|
| AAA Heavy (Cyberpunk 2077, Black Myth: Wukong) | 48-56 games | GPU Compute (CPU at ~85%) |
| AA Moderate (Helldivers 2, Forza Horizon 5) | 70-80 games | CPU Compute (capped from theoretical 96-120) |
| Esports Light (Dota 2, Rocket League) | 90-110 games | System CPU & OS Orchestration (capped from theoretical 200+) |
Technical Recommendations for 8-GPU Nodes:
- Containers over vGPU: Setting up KVM virtual machines with sliced vGPU profiles for 80+ users introduces massive hypervisor memory overhead. Containerized solutions (Docker/Podman with GPU passthrough) share the host Linux kernel directly, drastically reducing CPU context-switching overhead.
- NUMA Node Pinning: The dual Intel Xeon 6 setup splits the system into distinct NUMA (Non-Uniform Memory Access) zones. Specific GPUs must be pinned to the CPU socket they are physically wired to via PCIe. If a container running on GPU 7 (Socket 2) fetches memory managed by Socket 1, RAM latency spikes, ruining the stream.
- NVENC Allocation: With 32 total NVENC chips, configuring Sunshine to use AV1 or HEVC encoding yields high-quality streams with near-zero encoding latency, even with 100 concurrent users.
By weaponizing the cloud against itself, we eliminated the CapEx requirement entirely. We optimized per-tenant compute economics to $0.56/hr at startup scale and $0.65/hr at 56-tenant bare-metal density. We consolidated master storage unit costs to $0.78/mo per tenant.
The architecture holds positive unit economics during low-traffic periods via the idle cost management lifecycle, and retains the option to scale deterministically via the compute tiering strategy — reaching per-tenant costs comparable to operators running their own hardware fleets, without the CapEx.
If your enterprise requires aggressive, high-agency technical architecture, or if unit economics are blocking your scale, we architect systems that mitigate systemic risk and punch drastically above their weight class. Memon Systems provides Fractional CTO advisory and infrastructure assurance for organizations demanding operational supremacy.
The Impact
We transitioned the compute topology to Oracle Cloud (OCI), decoupled game state at the kernel storage layer via OverlayFS, and implemented a multi-tier compute scaling strategy from cost-optimized A10 nodes to high-density 8-GPU bare-metal clusters. We eliminated the data egress bottleneck, secured sustainable unit economics from $0.56/hr per tenant at startup scale to $0.65/hr at 56-tenant density, and achieved the operational leverage of a multi-billion dollar hardware monopoly without upfront CapEx.
Run this measurement against your own system.
Deployment Audit: £500, fixed scope. Credited in full against the next stage.
What this costs