Back in 2019 I watched a $2B SaaS platform go dark for 47 minutes on Cyber Monday — not because their origin failed, but because a noisy neighbor on the same CDN PoP saturated the shared edge pool. Their cache hit ratio dropped from 94% to 61% overnight and no amount of origin autoscaling could fix it. That incident is why I tell every enterprise team I advise: if your delivery is mission-critical, you don't want shared infrastructure with best-effort scheduling. You want a dedicated edge you can count on.
Why Shared Edge Pools Fail Enterprise SLAs
On a standard multi-tenant CDN, every customer shares the same CPU, memory, TLS session cache, and outbound bandwidth at each Point of Presence. That works brilliantly for 95% of traffic — it's cost-efficient and keeps global coverage cheap. But enterprise workloads aren't average. Think large software updates, live event streaming, or a SaaS app serving 10,000 tenants from one domain hierarchy. When traffic is bursty or cache keys are complex, contention happens at layers you can't see in your dashboard.
I've debugged this pattern more times than I can count. One customer — a fintech API — saw p95 latency triple during market open, with zero change in their own request volume. The culprit was another tenant's cache purge storm on the same PoP. Shared LRU eviction meant their hot objects were being evicted to make room for someone else's low-value assets. We traced it through `X-Cache-Status` and `Age` headers, but per the HTTP Working Group Specifications, those headers only tell you what happened after the fact. They don't prevent the contention.
This is the core limitation that pushes teams toward reserved models. If you've ever tried to reason about noisy neighbors in a shared system, you'll recognize the problem described in CDN Multi-Tenant Architecture: Isolating Customer Traffic While Sharing Infrastructure — logical separation isn't physical separation. Tags, VHosts, and tenant IDs isolate your configuration, but they don't reserve CPU cycles or memory for you when the PoP is under pressure. For a true enterprise SLA, you need guaranteed headroom, not just a separate config tree.
# Example: Diagnosing edge contention from response headers
# Run this from multiple PoPs during a suspected noisy-neighbor event
curl -s -D - "https://api.yourapp.com/v1/prices" -o /dev/null | grep -E "^(X-Cache|Age|X-PoP|Server-Timing)"
# What to look for across 100 requests:
# X-Cache: MISS, MISS, HIT, MISS <- hit ratio instability
# Age: 0, 2, 0, 4 <- frequent evictions
# Server-Timing: edge;dur=180 <- vs. normal 12-25ms
# If dur variance > 3x baseline on same PoP, you're contending for shared resources
# Terraform-style reservation check (pseudo-provider)
resource "cdn_edge_reservation" "primary" {
pop = "iad-03"
tier = "dedicated"
vcpu = 32
memory_gb = 128
bandwidth_gbps = 40
isolation = "hardware" # vs. "soft" for shared
}
What "Dedicated" Actually Reserves: Beyond a Vanity PoP
There's a lot of confusion about what a dedicated edge instance really is. It's not just a CNAME or a vanity IP address. A proper dedicated CDN deployment gives you reserved capacity at three layers: compute, cache, and network. At the compute layer, you're getting pinned vCPUs and memory on edge servers that don't run other tenants' workers or VCL. At the cache layer, you get a partitioned SSD/NVMe segment with your own eviction domain — your objects can't be evicted by someone else. And at the network layer, you get reserved bandwidth and dedicated TLS capacity, often with your own IP anycast announcement.
I learned the difference the hard way on a migration for a healthcare SaaS in 2021. They'd paid for "dedicated" from a provider that only gave them a dedicated configuration shard — same physical servers, same cache. Under HIPAA audit, that didn't satisfy their requirement for enterprise isolation. We had to re-architect to hardware-isolated instances where cache encryption keys and even log streams were physically separate. If you're evaluating vendors, ask this one question: "If another customer gets DDoS'd on this PoP, does my CPU steal time change?" If the answer isn't a hard no, it's not dedicated.
That level of isolation also unlocks things you simply can't do on shared pools. You can run persistent EdgeWorkers with 500ms+ CPU time, pin custom WAF rulesets without worrying about global rule limits, and keep large objects (think 50MB+ installers) hot in cache for days. For SaaS teams doing White-Label CDN Delivery: Custom Branding for SaaS Customer Domains, dedicated instances let you terminate thousands of custom certificates without hitting shared SAN limits or SNI rate caps. And as covered in web.dev Articles, performance at the edge is dominated by consistency — dedicated capacity turns a variable 25-180ms edge compute time into a predictable 12-18ms.
// Dedicated EdgeWorker with reserved CPU/memory
// This would be throttled or killed on a shared pool
export async function onRequest(request, context) {
// Persistent isolation: KV namespace exclusive to this tenant
const tenantConfig = await context.kv.get(`tenant:${request.hostname}`, {
isolation: 'dedicated', // no cross-tenant access possible
consistency: 'strong'
});
// CPU-intensive transform allowed because capacity is reserved
if (request.url.includes('/reports/')) {
const data = await fetchOriginWithRetry(request);
// 200ms of image/pdf generation that would exceed shared limits
const pdf = await generatePdfReport(data, { timeout: 400 });
return new Response(pdf, {
headers: {
'Cache-Control': 'private, max-age=300',
'CDN-Cache-Control': 'max-age=3600', // dedicated cache segment
'X-Edge-Instance': context.instance.id // e.g., iad-03-dedicated-07
}
});
}
return fetch(request);
}
Choosing Your Isolation Model: Reserved vs. Hybrid vs. Shared
Not every workload needs full hardware isolation in every PoP, and frankly, you shouldn't pay for it where you don't need it. What I've seen work best for large enterprises is a tiered approach. You reserve dedicated edge instances in your top 5-10 traffic PoPs — usually Ashburn, Frankfurt, Singapore, San Jose, London — and run hybrid or shared in the long tail. Your dedicated nodes handle 70-80% of your traffic with guaranteed performance, while the shared footprint gives you global reach without the cost of dedicated hardware in 150 cities.
The decision often comes down to compliance and blast radius. If you need cache separation with cryptographic guarantees, or you have strict rate-limiting per tenant that can't be affected by global PoP load, you need the patterns detailed in CDN Tenant Isolation Patterns: Cache Separation, Rate Limits, and Access Controls implemented on dedicated hardware. I've had customers who were fine with soft isolation for marketing sites but required hard isolation for their API and authenticated app delivery — same provider, two different edge pools, routed by hostname.
Don't just take the vendor's benchmark sheet at face value. Run your own synthetic tests with cache busters and sustained load. Measure p95 and p99, not averages, during peak hours for that PoP. The table below is from a real comparison I ran last year for a SaaS analytics company moving from shared to reserved capacity in `iad` and `fra`. The numbers are what convinced their CFO.
| Metric (7-day peak window) | Shared Pool | Hybrid (Dedicated in Top 5 PoPs) | Fully Dedicated (All PoPs) |
|---|---|---|---|
| p95 Edge Compute Time (ms) | 42 - 185 (high variance) | 14 - 22 | 11 - 16 |
| Cache Hit Ratio | 88.4% | 96.1% | 97.3% |
| Noisy-Neighbor Incidents / week | 3 - 5 | 0 | 0 |
| TLS Handshake p99 (ms) | 85 | 31 | 28 |
| Monthly Cost vs. Shared Baseline | 1x | 2.4x | 4.8x |
Provisioning Dedicated Edge Instances: Reservation Workflow and Activation
Reserving dedicated edge capacity isn't like spinning up another VM — you're carving out physical isolation on the PoP itself, and that takes coordination with capacity planning. We've seen enterprises get burned by treating it as an on-demand request. You'll want to start with your 95th percentile traffic, not your average. If you're pushing 18 Gbps at peak across us-east and eu-west, don't reserve 20 Gbps and call it a day. Reserve 30-35 Gbps with N+1 redundancy per PoP, otherwise a single hardware failure puts you right back in a contention scenario you paid to avoid. Most providers ask for a 1 or 3-year commit with a minimum of 10 Gbps per PoP, and provisioning lead time is typically 10-14 business days for bare-metal isolation, 24-48 hours for hypervisor-isolated reserved instances.
The activation itself is straightforward once capacity is allocated, but don't skip the shadowing phase. We always recommend running dedicated instances in mirror mode for 72 hours before cutover — 100% of production traffic is duplicated to the new instances, but responses are still served from the shared pool. This lets you validate cache hit ratio (you should see 92-96% for static assets), TLS handshake p99 staying under 15ms, and origin offload without risking user impact. It's also when you'll wire up tenant-aware routing and cert automation. If you're handling Custom Domain CDN for SaaS: Automated SSL and DNS for Customer Vanity Domains, you'll need to migrate your ACME and CAA logic to the dedicated control plane so vanity certs don't still terminate on shared edge.
# terraform example: reserving dedicated edge capacity per PoP
resource "cdn_dedicated_instance" "enterprise_edge" {
for_each = toset(["iad-01", "lhr-01", "sin-01"])
pop_code = each.key
isolation_mode = "bare_metal" # or "hypervisor_reserved"
reservation = {
committed_gbps = 15
burst_gbps = 25 # capped burst to shared pool
cpu_cores = 64 # dedicated, not vCPU
memory_gb = 512
nvme_cache_tb = 15.3
}
sla_tier = "enterprise_platinum" # 99.99% with 100% uptime credits
routing_policy {
tenant_sharding = "hostname_hash" # isolates cache keys per customer
failover_pool = "shared_burst" # or "none" for hard isolation
}
observability {
per_tenant_metrics = true
log_delivery_sla_ms = 30
}
}
# Cutover after 72h shadow validation:
# cdn-cli traffic shift --pop iad-01 --weight dedicated=100 --canary 5%
Hardening, Burst Contention, and Troubleshooting Noisy Neighbor Leakage
Here's where dedicated doesn't mean magic. If you've paid for isolation but still see p95 TTFB spikes from 45ms to 180ms during your neighbor's flash sale, you've got a leakage problem. The most common culprit we've debugged isn't CPU — it's shared upstream links or a misconfigured Anycast advertisement. Check that your dedicated instances have discrete 100Gbps uplinks, not a slice of a shared 400Gbps LAG. Another sneaky one: origin shield. You can isolate edge perfectly, but if your dedicated PoPs still collapse back to a shared shield PoP in Ashburn, you'll contend at mid-tier. Always reserve shield capacity in tandem, or run a dedicated shield cluster. We tell clients to budget an extra 20-30% for shield if origin offload is above 60%.
For burst handling, decide upfront: hard isolation or capped burst? Hard isolation guarantees you'll never exceed your reservation — great for compliance, terrible if you get featured on Product Hunt and need 3x overnight. Capped burst lets you spill over into the shared pool up to 40 Gbps for 5-minute windows, billed at overage rates (typically $0.04-0.08/GB). Set alerts at 75% and 90% of committed capacity, and wire them to auto-scale. The pattern that works best for SaaS is hybrid sharding with metered spillover — critical API traffic stays pinned to dedicated, while cacheable marketing assets can burst. Pair this with API Metering at CDN Edge: Real-Time Usage Tracking for SaaS Billing so you know exactly which tenant burned your burst quota, and CDN Usage Tracking for SaaS: Per-Customer Bandwidth and Request Analytics to attribute that 2.3 TB spike at 02:00 UTC to a single customer re-syncing.
If your cache hit ratio drops after migration — say from 94% to 82% — don't panic. It usually means your cache key isolation is too aggressive. When you shard by hostname hash, you lose cross-tenant deduplication for common libraries. Fix it with tiered keying: shard mutable, tenant-specific assets (like /api/v1/*) but keep shared assets (like /static/vendor.js) on a global key. Also, audit your log delivery. Dedicated instances should give you raw edge logs within 30 seconds, not 4-5 minutes like shared pools. If you're still seeing sampled logs, your observability tap is still pointed at the shared aggregator.
Frequently Asked Questions
What's the real performance difference between hypervisor-reserved and bare-metal dedicated?
On paper, both eliminate noisy neighbors. In practice, bare-metal gives you 12-18% lower p99 latency because you avoid hypervisor scheduling jitter, and you get full NVMe locality — think 15.3TB of local cache vs. 4-6TB with virtualized slices. Hypervisor-reserved is fine for 95% of enterprise workloads and provisions in 1-2 days, but if you're running low-latency APIs or WebSockets that need consistent <20ms TTFB at 50k RPS per PoP, go bare-metal. We've measured hypervisor steal time spiking to 3-4% under host contention; bare-metal stays at 0%.
Can we use dedicated edge instances only for specific customers or traffic classes?
Absolutely, and that's the recommended pattern. You don't need to move 100% of traffic. Use edge routing rules to pin premium enterprise tenants, PCI-scoped traffic, or latency-sensitive API routes to dedicated, and leave long-tail traffic on shared. For example, route *.enterprise.yourdomain.com and /api/checkout/* to dedicated, everything else to shared/hybrid. This keeps your commit at 10-15 Gbps instead of 40 Gbps and cuts costs by 40-60% while still guaranteeing SLAs where it matters.
How does billing work when we exceed our reserved bandwidth?
You're billed on 95th percentile or total GB transferred, depending on contract — 95th is more forgiving for bursty SaaS. If you reserved 15 Gbps and burst to 22 Gbps for 8 hours during Black Friday, you'll pay overage only on the delta above 15 Gbps, usually at 1.2-1.5x your committed rate. With capped burst enabled, the provider throttles spillover at your burst cap (e.g., 25 Gbps) rather than dropping. Pro tip: negotiate burst credits — many providers include 10% free burst (so 1.5 Gbps free on a 15 Gbps commit) if you push for it.
Do dedicated instances actually help with compliance (SOC 2, HIPAA, ISO 27001)?
Yes, significantly. Shared pools can't give you physical isolation attestations, dedicated can. Bare-metal reservations come with single-tenant hardware letters, no co-mingling of memory or disk cache, and isolated log streams — all required for HIPAA and PCI-DSS 4.0 scoping. You'll also get fixed egress IPs for allowlisting and the ability to pin TLS private keys to HSMs in your PoP, so keys never touch shared infrastructure. Auditors love that paper trail; we've seen SOC 2 Type II evidence collection drop from 3 weeks to 4 days after moving to dedicated.