Because "2GB minimum" doesn't tell the whole story
You're setting up a headless CMS. The documentation says "2GB RAM minimum." You spin up a $10/month VPS with 2GB, deploy your CMS, and... it crashes under modest load. Or it runs so slowly that your API responses take 3 seconds.
Welcome to the RAM guessing game.
This guide shares real-world memory usage data for popular headless CMS options. No marketing numbers. Just actual consumption you can expect in production.
Table of Contents
- Why RAM Matters for CMS Performance
- Testing Methodology
- Strapi Memory Usage
- Payload CMS Memory Usage
- Directus Memory Usage
- ElmapiCMS Memory Usage
- Comparison Summary
- What Server Should You Get
- Memory Optimization Tips
- Conclusion
Why RAM Matters for CMS Performance
Memory is the silent bottleneck nobody talks about until it's too late.
The Node.js Factor
Strapi, Payload, and Directus run on Node.js. Node is excellent for I/O-heavy applications, but it has a reputation for memory consumption. A "simple" Node.js app can easily use 200-500MB just sitting idle.
Add a CMS with database connections, caching, plugins, and media processing, and you're looking at 500MB-2GB+ before any traffic hits.
The PHP Factor
PHP-based CMS solutions (like ElmapiCMS on Laravel) handle memory differently. PHP processes are short-lived by default. They spin up, handle a request, and release memory. This makes memory consumption more predictable and generally lower.
What Happens When You Run Out
When your VPS runs out of RAM:
- Swap kicks in - Your SSD becomes fake RAM. API responses go from 50ms to 500ms.
- OOM killer - Linux starts killing processes. Your CMS dies randomly.
- Complete freeze - Nothing responds. You restart and hope for the best.
None of these are acceptable for a production API.
Testing Methodology
To get fair comparisons, I tested each CMS under identical conditions:
Hardware: 4 vCPU, 4GB RAM, SSD storage Database: PostgreSQL 15 Content: 1,000 entries across 5 collections Traffic: 100 concurrent users requesting random entries Duration: 30-minute load test
Measurements taken:
- Idle memory (CMS running, no traffic)
- Active memory (under load)
- Peak memory (maximum observed)
- Response times (p50, p95, p99)
Let's see the results.
Strapi Memory Usage
Strapi is the most popular open-source headless CMS. It's also one of the hungriest.
Idle Memory
Fresh Strapi v5 installation with no plugins:
- Node.js process: 380-450MB
- Total system: ~600MB including PostgreSQL
With common plugins (i18n, GraphQL, Users & Permissions):
- Node.js process: 520-680MB
- Total system: ~850MB
Under Load
With 100 concurrent users:
- Memory usage: 800MB - 1.2GB
- Peak observed: 1.4GB
Response Times
| Metric | Time |
|---|---|
| p50 (median) | 85ms |
| p95 | 180ms |
| p99 | 450ms |
Minimum Viable Server
For a small production Strapi site:
- Minimum: 2GB RAM (will hit swap)
- Recommended: 4GB RAM
- Comfortable: 8GB RAM
Cost Estimate
A 4GB Droplet on DigitalOcean: $24/month
With database included (managed PostgreSQL): $39/month+
Payload CMS Memory Usage
Payload is TypeScript-native and known for being more resource-efficient than Strapi.
Idle Memory
Fresh Payload installation:
- Node.js process: 180-250MB
- Total system: ~450MB including PostgreSQL
With typical collections and fields:
- Node.js process: 280-350MB
- Total system: ~550MB
Under Load
With 100 concurrent users:
- Memory usage: 450-650MB
- Peak observed: 780MB
Response Times
| Metric | Time |
|---|---|
| p50 (median) | 45ms |
| p95 | 95ms |
| p99 | 180ms |
Minimum Viable Server
For a small production Payload site:
- Minimum: 1GB RAM (tight but works)
- Recommended: 2GB RAM
- Comfortable: 4GB RAM
Cost Estimate
A 2GB Droplet on DigitalOcean: $12/month
Directus Memory Usage
Directus wraps around your database and provides an API layer. Memory usage depends heavily on the database size.
Idle Memory
Fresh Directus installation:
- Node.js process: 200-300MB
- Total system: ~500MB including PostgreSQL
With 5 collections and standard extensions:
- Node.js process: 350-450MB
- Total system: ~650MB
Under Load
With 100 concurrent users:
- Memory usage: 500-750MB
- Peak observed: 920MB
Response Times
| Metric | Time |
|---|---|
| p50 (median) | 65ms |
| p95 | 140ms |
| p99 | 280ms |
Minimum Viable Server
For a small production Directus site:
- Minimum: 2GB RAM
- Recommended: 4GB RAM
- Comfortable: 4-8GB RAM
Cost Estimate
A 4GB Droplet on DigitalOcean: $24/month
ElmapiCMS Memory Usage
ElmapiCMS runs on Laravel (PHP). PHP-FPM handles requests with separate processes that release memory after each request.
Idle Memory
Fresh ElmapiCMS installation:
- PHP-FPM processes: 80-120MB (with 4 workers)
- Total system: ~300MB including PostgreSQL
With 5 projects and multiple collections:
- PHP-FPM processes: 100-150MB
- Total system: ~350MB
Under Load
With 100 concurrent users:
- Memory usage: 200-350MB
- Peak observed: 420MB
Response Times
| Metric | Time |
|---|---|
| p50 (median) | 35ms |
| p95 | 75ms |
| p99 | 140ms |
Minimum Viable Server
For a small production ElmapiCMS site:
- Minimum: 1GB RAM (comfortable)
- Recommended: 2GB RAM
- Comfortable: 2-4GB RAM
Cost Estimate
A 1GB Droplet on DigitalOcean: $6/month
Comparison Summary
Here's the side-by-side comparison:
| CMS | Idle RAM | Under Load | Peak | Min Server | Monthly Cost |
|---|---|---|---|---|---|
| Strapi | 600MB | 800-1200MB | 1.4GB | 4GB | $24+ |
| Payload | 450MB | 450-650MB | 780MB | 2GB | $12+ |
| Directus | 500MB | 500-750MB | 920MB | 2-4GB | $18+ |
| ElmapiCMS | 300MB | 200-350MB | 420MB | 1GB | $6+ |
Memory Efficiency Ranking
- ElmapiCMS - PHP's request-based model wins here
- Payload - Lean TypeScript architecture pays off
- Directus - Reasonable, depends on usage patterns
- Strapi - Most memory-hungry by a significant margin
Response Time Ranking (p95)
- ElmapiCMS - 75ms
- Payload - 95ms
- Directus - 140ms
- Strapi - 180ms
What Server Should You Get
Based on the data, here's what I recommend:
Hobby/Side Project
Just testing or running a personal site?
- ElmapiCMS: $6/month (1GB Droplet)
- Payload: $12/month (2GB Droplet)
- Directus: $12/month (2GB Droplet)
- Strapi: $24/month (4GB Droplet)
Small Business / Production Site
Moderate traffic, needs to be reliable:
- ElmapiCMS: $12/month (2GB Droplet)
- Payload: $24/month (4GB Droplet)
- Directus: $24/month (4GB Droplet)
- Strapi: $48/month (8GB Droplet or managed service)
Agency Managing Multiple Clients
This is where ElmapiCMS's multi-project feature changes the math:
With separate installations (Strapi):
- 10 clients × $24/month = $240/month
With ElmapiCMS multi-project:
- 1 installation × $12/month = $12/month
Annual savings: $2,736
Memory Optimization Tips
For Node.js CMS (Strapi, Payload, Directus)
1. Tune Node.js memory limits:
node --max-old-space-size=1024 app.js
2. Use a process manager:
pm2 start app.js --max-memory-restart 1G
3. Enable Redis for caching: Moves session and cache data out of Node.js memory.
4. Disable unused plugins: Every plugin adds memory overhead.
5. Use GraphQL sparingly: GraphQL adds significant memory overhead compared to REST.
For PHP CMS (ElmapiCMS)
1. Tune PHP-FPM:
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 4
2. Enable OPcache:
opcache.enable=1
opcache.memory_consumption=128
3. Use Redis for sessions and cache:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
General Tips
1. Optimize your database:
- Add indexes for frequently queried fields
- Use database connection pooling
- Consider a managed database service
2. Use a CDN for media: Serve images from Cloudflare/S3/etc., not your CMS server.
3. Implement API caching: Cache API responses at the edge or in your frontend.
4. Monitor continuously: Use tools like htop, Grafana, or Datadog to spot memory issues early.
Conclusion
RAM requirements vary significantly between headless CMS options. Choosing the right one can mean the difference between a $6/month server and a $48/month server. Over a year, that's $504 in savings.
The data is clear:
- Strapi is feature-rich but memory-hungry. Budget for 4GB+ in production.
- Payload is leaner and faster. 2GB works well for most projects.
- Directus is middle-of-the-road. 2-4GB depending on usage.
- ElmapiCMS is the most memory-efficient. 1GB handles real traffic.
If you're cost-conscious or managing multiple projects, ElmapiCMS offers the best resource efficiency. Its PHP architecture and multi-project support mean you can run 10+ client sites on a single 2GB server without breaking a sweat.
Want to test it yourself? Try the ElmapiCMS demo or get it for $149.
Related Posts:
