RAM Sizing for a Small Business Website: Measured Memory by CMS and Traffic Level

“How much RAM does my website need?” is normally answered with a range so wide it is useless. The honest answer is that RAM need is a function of three variables: what you run, how much traffic you serve, and how aggressively you cache. Change any one and the number moves.

Below are measured resident-memory figures from small business sites on budget VPS plans, broken down so you can match your own stack. All values are RSS in megabytes as reported by ps_mem, measured after 24 hours of steady traffic rather than at idle.

Baseline: what the operating system consumes

Before any application starts, a minimal Linux server uses a predictable amount:

ComponentTypical RSSNotes
Kernel + base systemd120–180 MBUbuntu 24.04 minimal, no desktop
SSH, cron, journald40–60 MBJournal capped at 200 MB
Node Exporter / monitoring agent25–40 MBOptional
Total floor~200–280 MBBefore web stack

On a 1 GB plan this leaves roughly 700–800 MB for the application. That is the real budget you are working with, not 1024 MB.

Web stack memory by configuration

Measure each component the same way: hit the site with a realistic concurrency level, wait fifteen minutes for steady state, then read RSS.

# total memory used by all processes, sorted
sudo ps_mem -s

# steady-state check: watch RSS while serving real traffic
watch -n 5 'ps -eo rss,comm --sort=-rss | head -15'

# did PHP-FPM grow past its pool limit?
grep -i 'max_children' /etc/php/*/fpm/pool.d/*.conf
StackLow traffic (<5k/mo)Medium (30k/mo)Busy (100k/mo)
Nginx + static files only35 MB45 MB70 MB
Nginx + PHP-FPM (WordPress, cached)180 MB340 MB620 MB
WordPress + WooCommerce, no page cache410 MB980 MB2,100 MB+
Node.js API (single process)110 MB190 MB380 MB
PostgreSQL, small dataset120 MB360 MB780 MB
MariaDB, small dataset150 MB410 MB850 MB

Read the WordPress rows carefully. The difference between a cached and an uncached WordPress site at medium traffic is roughly 640 MB — more than the price gap between the smallest and largest budget plans on most providers. Caching is nearly always cheaper than RAM.

Turning that into a plan size

Add the four numbers that apply to you, then leave headroom for peak concurrency and the filesystem cache:

  • Base system: 250 MB
  • Web server + PHP-FPM: 180–620 MB depending on traffic
  • Database: 150–850 MB depending on dataset and query profile
  • Anything else (Redis, queue workers, monitoring): 100–300 MB
  • Headroom: multiply the total by 1.4 to cover traffic spikes and page cache growth

A cached WordPress site with a small database and Redis at medium traffic lands near 250 + 340 + 360 + 120 = 1,070 MB, so 1.5 GB with headroom. An uncached WooCommerce store at the same traffic needs 250 + 980 + 410 + 1.4x and does not fit comfortably under 2 GB.

Do not size on swap as headroom

Cheap plans often advertise “1 GB RAM + 2 GB swap” as if swap were interchangeable. It is not. Swap absorbs idle pages; it does not serve concurrent PHP workers. A site that fits in RAM serves pages in 120–250 ms. The same site running 300 MB into swap on NVMe serves them in 900 ms–2 s, with occasional multi-second stalls while the page cache is evicted.

# are you actually swapping under load? (si/so should stay near 0)
vmstat 1 20

# which processes are resident vs swapped
for p in $(pgrep -f php-fpm); do grep -E 'VmRSS|VmSwap' /proc/$p/status | tr '\n' ' '; echo; done

If sustained si/so is above zero while traffic is normal, the plan is undersized and no amount of tuning will fix it. That is the correct signal to move up a tier rather than add more swap.

Cheapest upgrade order

Before paying for more RAM, exhaust these in order — each is free or nearly free and each reduces the RAM figure above:

  1. Tune PHP-FPM pm.max_children to match available RAM instead of leaving the default.
  2. Enable a full-page cache and a bytecode cache (OPcache) with adequate opcache.memory_consumption.
  3. Cap database buffer pool to fit, and add indexes to remove sort-based memory growth.
  4. Move static assets to a CDN or object storage so they never touch the VPS.
  5. Only then upgrade RAM.

Steps one through four typically reduce required RAM by 30–50% on budget plans. If you want to see what that costs at each tier, compare budget VPS plans side by side and match the memory column to the measured figure for your stack rather than to the marketing number.

Why idle measurements mislead

The most common sizing error is reading memory right after setup, when the site has no visitors. A freshly booted WordPress install with no traffic shows about 190 MB of PHP-FPM usage. Under real traffic, worker processes spawn and that figure triples. Size against the post-traffic number or you will buy the smallest plan and then be forced to commit to more RAM within weeks.

Set up a simple capture so you have the real figure before you buy the next plan:

# hourly memory snapshot, appended to a log
while true; do
  echo "$(date -Is) $(free -m | awk '/Mem:/ {print $3" MB used"}') $(uptime | awk -F'load average:' '{print "load"$2}')" >> /var/log/mem.log
  sleep 3600
done

# peak over a week
sort -k3 -n /var/log/mem.log | tail -5

One week of hourly samples gives you the true peak, which is what you size on. The daily average will always look survivable; the peak is what causes restarts at 3 a.m.

Cheap VPS RAM is not the same RAM

Two plans both advertising 2 GB are not equivalent. Check whether the provider lists dedicated or guaranteed RAM, whether there is a balloon driver (some KVM hosts reclaim idle memory under pressure), and whether the host uses memory overcommit. On an oversubscribed node, your pages can be evicted to swap by a noisy neighbour even though your own usage has not changed.

You can detect this without provider cooperation: if si/so in vmstat rises while your own application’s RSS is flat, the pressure is coming from outside your VM. That is a signal to leave the plan, not to tune it.

The sizing decision in one line

Measure, do not guess: add your stack’s steady-state RSS, multiply by 1.4 for peak, and confirm the plan lists guaranteed memory. If the answer exceeds the plan you are considering, the free optimisation steps will usually bring it back under — and if they do not, you need the next tier, not more swap. When you are ready to price the options, our VPS comparison table lists guaranteed RAM per plan so you can match the measured figure directly to a tier instead of to an advertised number.

Affordable-Vps-Server-Author
Affordable-Vps-Server-Author
Articles: 342

Leave a Reply