---
title: "bunny.net cache warming: Perma-Cache, per-PoP caches and keeping both hot — warmup.rocks"
description: "bunny.net caches per PoP, and Perma-Cache adds a persistent storage layer. What each layer does for cold starts, how Smart Cache and purges behave, and how to warm bunny.net properly."
canonical: https://warmup.rocks/blog/bunny-cache-warming
---

bunny.net

# bunny.net cache warming: Perma-Cache, per-PoP caches and keeping both hot

July 2026 · 7 min read · [← All posts](https://warmup.rocks/blog/)

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](https://warmup.rocks/blog/cf-cache-status) 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](https://warmup.rocks/cache-checker), which detects bunny.net automatically.

## Layer 2: Perma-Cache — the cold-start killer for origins

With [Perma-Cache](https://bunny.net/cdn/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](https://warmup.rocks/blog/cloudfront-cache-warming): 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

1.  **Cache your HTML.** bunny respects origin `Cache-Control`; for CMS origins that send `no-cache` reflexively, use Edge Rules or bunny's cache override settings to force a TTL for anonymous HTML. If the checker shows `CDN-Cache: MISS` on every run, nothing is being stored.
2.  **Enable Perma-Cache** for mostly-static content — it converts eviction-misses and new-region-misses into cheap storage fetches.
3.  **Warm after every purge.** Deploy → purge → the first visitor per URL rebuilds Perma-Cache from your origin. A [deploy hook](https://warmup.rocks/docs/deploy-hooks) 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.
4.  **Warm on a schedule** matched to your TTLs, so long-tail pages and low-traffic regions don't rot. That's what [warmup.rocks](https://warmup.rocks/) automates — with per-location [hit ratios](https://warmup.rocks/blog/cache-hit-ratio) 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](https://warmup.rocks/ttfb-test): warm PoPs answer in tens of milliseconds.
