bunny.net cache warming: Perma-Cache, per-PoP caches and keeping both hot
bunny.net punches far above its price class, and its caching stack has a feature the big CDNs don't offer in this form: Perma-Cache, a persistent storage-backed cache layer that survives everything. That changes the cache warming math in an interesting way — it removes one class of cold starts entirely and leaves another fully intact. Let's take the layers apart.
Layer 1: the per-PoP edge cache
Like every CDN, bunny.net's ~120 PoPs each keep an independent
cache. The CDN-Cache: HIT/MISS response header (plus
CDN-RequestId and a Server: BunnyCDN-… header naming the PoP)
tells you what happened at the PoP that served you — and only that one. A HIT in
Amsterdam is still a MISS in São Paulo. Edge
entries are also evicted under memory pressure: low-traffic URLs fall out of hot PoPs
even before their TTL expires. You can watch all of this per location with our
cache checker, which detects bunny.net automatically.
Layer 2: Perma-Cache — the cold-start killer for origins
With Perma-Cache enabled, bunny.net writes cached objects to a bunny Storage zone. When an edge PoP misses, it fetches from that storage replica instead of your origin — and storage never evicts and never expires (until you purge or overwrite). In cache warming terms:
| Cold-start cause | Without Perma-Cache | With Perma-Cache |
|---|---|---|
| PoP eviction / low-traffic URL | Full origin round trip | Fast fetch from nearby storage replica |
| First request in a new region | Full origin round trip | Fast fetch from storage replica |
| After a purge / deploy | Origin round trip everywhere | Origin once per URL, then storage serves all PoPs |
So Perma-Cache is bunny's version of what shielding does at Fastly or the regional edge caches at CloudFront: it protects the origin and softens misses. What it does not do is make the edge PoP itself fast on first hit — the edge→storage fetch is quick, but it's not the sub-50-ms answer a warm PoP gives. And critically, after a purge the storage copy is gone too: the first request per URL pays the full origin price again.
What warming looks like on bunny.net
- Cache your HTML. bunny respects origin
Cache-Control; for CMS origins that sendno-cachereflexively, use Edge Rules or bunny's cache override settings to force a TTL for anonymous HTML. If the checker showsCDN-Cache: MISSon every run, nothing is being stored. - Enable Perma-Cache for mostly-static content — it converts eviction-misses and new-region-misses into cheap storage fetches.
- Warm after every purge. Deploy → purge → the first visitor per URL rebuilds Perma-Cache from your origin. A deploy hook that triggers a warming run right after the purge means the warmer is that first visitor — from 90+ locations, so the edge PoPs fill at the same time.
- Warm on a schedule matched to your TTLs, so long-tail pages and low-traffic regions don't rot. That's what warmup.rocks automates — with per-location hit ratios per run, so you see exactly which PoPs were cold.
The honest summary
Perma-Cache makes bunny.net one of the most forgiving CDNs for cold origins — but it moves the problem rather than removing it: your visitors' TTFB still depends on whether their PoP has the object in its edge cache. Warming fills exactly that layer, and on bunny.net it's unusually cheap for the origin, because Perma-Cache absorbs most of the warming fetches. Verify the result yourself with the global TTFB test: warm PoPs answer in tens of milliseconds.
Keep every bunny PoP warm — automatically
warmup.rocks warms your bunny.net zone from 90+ edge locations on a schedule and after every deploy. bunny.net is auto-detected (CDN-Cache header), hit ratio reported per location.
Start your 7-day free trial