DNS & ad blocking
Pi-hole VPS requirements: RAM, CPU, disk, and how not to run an open resolver
Pi-hole is a DNS sinkhole: devices use it as their DNS server, and it answers queries for ad and tracking domains with nothing. At its core is pihole-FTL, a resolver based on dnsmasq that, since v6, also serves the web interface and API itself. It is built for a home network, and it's tiny: the project asks for 512 MB of RAM and 2 GB of free disk. On a VPS it's a popular way to block ads on phones and laptops wherever they are, but only behind a VPN such as WireGuard. A Pi-hole with port 53 open to the internet is an open resolver, which gets abused for DNS amplification attacks and draws abuse tickets from hosting providers. The server size barely matters; the firewall does.
Sizing guide
Our recommendations, derived from the sourced figures below. Not measurements.
| Scenario | RAM | vCPU | Why |
|---|---|---|---|
| Pi-hole plus WireGuard for your own phones and laptops | 1 GB | 1 | The official minimum is 512 MB, and reports put pihole-FTL at about 70–200 MB. 1 GB leaves room for the OS, WireGuard and blocklist updates without swap, and it's usually the smallest plan sold. We haven't measured it on a VPS yet. |
| Same, plus Unbound as your own recursive resolver | 1 GB | 1 | The Pi-hole Unbound guide says there are no additional hardware requirements. We found no published RAM figure for Unbound alongside Pi-hole, so treat this as our estimate. |
| Very large blocklists (millions of domains) or many devices | 2 GB | 1–2 | Blocklist updates build a large database in memory: a 256 MB VM was killed during one, and forum members advise 1 GB or more for large lists. 2 GB is our headroom estimate, not a measurement. |
| Pi-hole as one container next to other apps | +256–512 MB | shared | Our estimate from the reports above: add Pi-hole's share to whatever the rest of the box needs. Keep its DNS port bound to the VPN interface, not the public one. |
Official requirements
| Item | What the project says | Source |
|---|---|---|
| Hardware | "Min. 2GB free space, 4GB recommended" and "512MB RAM". Any hardware that runs a supported OS will do, not only a Raspberry Pi | Pi-hole docs: Prerequisites checked Oct 30, 2026 |
| Operating systems and CPUs | Officially supported: Alpine, Armbian, Debian, CentOS Stream, Fedora, Raspberry Pi OS and Ubuntu, actively maintained versions only. pihole-FTL is pre-built for x86_64, armv6, armv7, armv8 (aarch64) and riscv64 | Pi-hole docs: Prerequisites checked Oct 30, 2026 |
| Ports | 53 TCP/UDP for DNS, 80 and 443 TCP for the web interface (FTL falls back to 8080/8443 if those are taken), and optionally 67/547 UDP for DHCP and 123 UDP for NTP. The docs' firewall examples allow these only from local network ranges "because Pi-hole was designed to work inside a local network" | Pi-hole docs: Prerequisites, Ports and Firewalls checked Oct 30, 2026 |
| Default listening mode | "Allow only local requests": FTL answers only hosts on a subnet the server has an interface on, which keeps an unconfigured install from being used for amplification attacks. "Permit all origins" is listed as potentially dangerous because "your Pi-hole could become an open resolver" | Pi-hole docs: FTLDNS interfaces checked Oct 30, 2026 |
| Docker | Image pihole/pihole. The official compose example publishes 53, 80 and 443 and sets FTLCONF_dns_listeningMode to ALL, which the README says is needed on Docker's default bridge network. NET_ADMIN is only needed for DHCP. Lists update weekly on Sunday morning from a cron job inside the container | GitHub: pi-hole/docker-pi-hole README checked Oct 30, 2026 |
| Query database | Queries are written to pihole-FTL.db every 60 seconds and kept for 91 days by default (database.maxDBdays; 0 turns the database off). The API and dashboard load up to 24 hours of history into memory (webserver.api.maxHistory, default 86400 seconds) | Pi-hole docs: FTL configuration options checked Oct 30, 2026 |
| Remote use | The project's recommended way to use Pi-hole away from home is a WireGuard server on the same machine. The guide warns that the easy installer has led many people to create an open resolver "knowingly--or unknowingly" | Pi-hole docs: WireGuard guide checked Oct 30, 2026 |
| Current versions | Core v6.5, FTL v6.8 and Docker image 2026.10.0, all released 17 Oct 2026. The Docker tags are date-based and don't map to a version number | GitHub: pi-hole/FTL releases checked Oct 30, 2026 |
What people report in practice
Individual reports, not controlled tests. Versions, hardware and settings differ, so treat these as data points, not guarantees.
-
After upgrading from v5 to v6, pihole-FTL memory went from about 70 MB to a peak of 150 MB over a month of use, with CPU spikes only during updates
r/pihole, March 2025, Debian unprivileged LXC container
Reddit r/pihole: Pihole 5 vs Pihole 6 memory and CPU usage · checked Oct 30, 2026
-
pihole-FTL showed 159.5 MB resident (36.6% of the machine's RAM) with high sustained CPU on early v6. The lead FTL developer said more RAM is expected in v6 because of an in-memory database behind the server-side query log, and that a test VM with 256 MB hit an out-of-memory kill during a blocklist update. A user with about 2 million blocklisted domains had run v5 in 128 MB for years and needed 256–300 MB on v6; the developer's reply: "256 MB of RAM may just be too little in modern times"
GitHub issue, Feb to Mar 2025, FTL v6.0 to v6.0.5. FTL v6.0.4 fixed the sustained CPU load for several reporters
GitHub GitHub pi-hole/FTL #2194: V6 high sustained CPU and memory load · checked Oct 30, 2026
-
Pi-hole v6 took just over 4 minutes to start because pihole-FTL.db had grown to 6.8 GB with over 100 million rows. Deleting everything older than 30 days and running VACUUM shrank it to about 270 MB and DNS came back right after reboot. In the same thread, members said 1 GB of RAM or more is better for processing large blocklists
Pi-hole Discourse, Feb 2025, VMs with 4 GB RAM and 2 cores, upgraded from a long-running v5 install
Forum Pi-hole Discourse: Pihole 6 slow start-up with large gravity lists · checked Oct 30, 2026
-
On a 512 MB Raspberry Pi Zero 2 W with about 28 clients and small blocklists (gravity.db 7.8 MB), pihole-FTL used about 130 MB, swap was around 140 MB and the dashboard took 5–10 seconds to load. Another user fixed a slow v6 on a Pi 3 by shrinking the FTL database
Pi-hole Discourse, 2025, Pi-hole also acting as a Tailscale subnet router. Shows that 512 MB is tight once the OS and other services share it
Forum Pi-hole Discourse: High query latency and slow dashboard on Pi Zero · checked Oct 30, 2026
-
Expected about 200 MB of RAM but pihole-FTL took 2 GB plus 1.5 GB of swap after the v6 update and stopped answering DNS. The cause turned out to be a wrong system clock on the host; fixing the time fixed it
Pi-hole Discourse, Feb 2025
Forum Pi-hole Discourse: Pi-hole stopped working after v6 update · checked Oct 30, 2026
-
A user who exposed Pi-hole on a cloud VPS got a notice from their country's cybersecurity agency within about two days. Others in the thread run Pi-hole with WireGuard, OpenVPN or Tailscale on the VPS and allow ports 53, 80 and 443 only from the tunnel interface
r/pihole, May 2022, thread titled "PiHole on small cloud VPS, how safe is it"
Reddit r/pihole: PiHole on small cloud VPS, how safe is it · checked Oct 30, 2026
Our measurements: coming soon
We haven't measured Pi-hole yet, so there are no VPSfit lab numbers on this page. When we do, they'll show the app version, the plan it ran on, the date, and the raw data. Here's what we'll record:
- Idle RAM of Pi-hole v6 with WireGuard on a 1 GB plan, default blocklist, five devices, over 24 hours
- Peak RAM and duration of a blocklist update with the default list and with a 2-million-domain list
- Query latency from a phone over WireGuard to Pi-hole on VPSes in different regions, with and without Unbound
- Size of pihole-FTL.db after 30 days of personal use
What drives Pi-hole's RAM use
Blocklists (gravity) are the main memory cost
Every domain on your lists ends up in Pi-hole's gravity database, and an update rebuilds it. The memory use grows with the size of the lists: a user with about 2 million domains had to raise a container from 256 MB to 300 MB to let an update finish, and the lead developer hit an out-of-memory kill on a 256 MB test VM (FTL #2194). The default list is far smaller. More lists rarely block much more, so trimming them is cheaper than a bigger server.
v6 keeps a day of queries in memory
Version 6 moved the query log to the server and keeps an in-memory database so it stays fast, which roughly doubled memory compared with v5 for some users, from about 70 MB to 150 MB (Reddit). The API loads up to 24 hours of history by default; lowering webserver.api.maxHistory shrinks it (config docs). A handful of personal devices makes a small history.
Disk: the query database grows for 91 days
Queries are stored for 91 days by default (config docs). On a busy network that adds up: one long-running install reached a 6.8 GB database that made v6 take over four minutes to start (Discourse). A few personal devices behind WireGuard produce far less, and lowering database.maxDBdays caps it.
CPU barely matters
The docs say Pi-hole does not need much processing power (prerequisites), and it runs on a Raspberry Pi Zero. CPU spikes come from blocklist updates and, if you route all traffic through the VPS, from WireGuard encryption. One shared vCPU is enough for personal use.
Gotchas on a VPS
- Never open port 53 to the internet. A public resolver is used in DNS amplification attacks against other people. Pi-hole's own WireGuard guide warns about this (guide), hosting providers such as Linode open abuse tickets when they detect one (Linode), and one VPS user heard from a national cybersecurity agency within two days (Reddit). Reach it through WireGuard, Tailscale or another VPN, and allow 53, 80 and 443 only from the tunnel. Check from outside with a site like openresolver.com.
- The Docker example is unsafe on a VPS as written. The official compose file publishes
53:53,80:80and443:443on every interface and sets the listening mode to ALL (README). On a home LAN that's fine. On a VPS it's an open resolver and a public admin page, and Docker's published ports bypass UFW (Docker docs), so a UFW rule won't save you. Publish the ports on the WireGuard address only (for example10.8.0.1:53:53/udp), or use the provider's cloud firewall, which sits outside the VPS. - On a bare install, the default protects you unless you change it. A non-Docker install defaults to "Allow only local requests", so it answers only hosts on subnets the server has an interface on. A WireGuard interface on the same machine counts as local, so it works without switching to "Permit all origins" (docs; Discourse). Don't flip that setting to make something work.
- Free port 53 on Ubuntu first. Ubuntu's systemd-resolved stub listener holds port 53 and stops Pi-hole from binding it. The docs show how to turn off the stub and repoint
/etc/resolv.conf(tips and tricks). - Don't auto-update it. The project asks people not to update the container automatically with tools like Watchtower: read the release notes and update by hand (docs). Your DNS is what every device needs to reach anything, including the fix.
- Keep the clock right and the database small. A wrong system clock sent one v6 install to 2 GB of RAM plus swap (Discourse), and an oversized query database slowed another to a four-minute start (Discourse). Check that NTP is running, and lower
database.maxDBdaysif you don't need three months of history.
Cheapest plans that fit
Pi-hole plus WireGuard for personal devices: 1 GB RAM and 1+ vCPU
Threshold: Official minimum 512 MB; reports put pihole-FTL at about 70–200 MB, and 1 GB leaves room for the OS, WireGuard and blocklist updates (source). Only plans with at least 1 vCPU are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Vultr Cloud Compute Regular 1 GB | 1 GB | 1 shared, previous-gen Intel | 25 GB SSD | $5.00 before tax |
Monthly price, hourly billing | vultr.com checked Oct 28, 2026 |
| DigitalOcean Basic 1 GiB | 1 GB | 1 shared | 25 GB SSD | $6.00 before tax |
Monthly cap, per-second billing | digitalocean.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
Pi-hole with very large blocklists: 2 GB RAM and 1+ vCPU
Threshold: Our estimate, not a measurement: a 256 MB VM ran out of memory during a large blocklist update and forum members advise 1 GB or more for large lists (source). Only plans with at least 1 vCPU are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Vultr Cloud Compute Regular 2 GB | 2 GB | 1 shared, previous-gen Intel | 55 GB SSD | $10.00 before tax |
Monthly price, hourly billing | vultr.com checked Oct 28, 2026 |
| Hostinger KVM 1 | 4 GB | 1 AMD EPYC | 50 GB NVMe | $11.99 intro $6.49 before tax |
Prepaid intro rate; renews at $11.99/mo | hostinger.com checked Oct 28, 2026 |
Prices checked Oct 28, 2026 on each provider's official pricing page. EUR prices converted at the ECB rate of Oct 27, 2026 (1 € = $1.115) only for ranking. See all plans on the cheapest 4 GB VPS page.