SCALING
August 5, 2026

Signs It's Time to Upgrade Your Server

6 min read
Author
CloudStick Team
Backend Developer
Share this article
Signs It's Time to Upgrade Your Server
CloudStick
Time To
Upgrade?

Sustained Load Average, Not a Snapshot

A single high load average reading proves nothing — the real signal is load average that stays above your core count for days or weeks at a time, not a spike that shows up once and disappears. Load average is a rolling measure of how many processes are running or waiting for CPU time, averaged over 1, 5, and 15 minutes, and it only becomes meaningful once you compare it against how many cores you actually have.

uptime
# 14:32:01 up 41 days, 3:12, 2 users, load average: 4.82, 4.61, 4.30
nproc
# 4

A 4-core box running a sustained load average near or above 4.0 for the 15-minute figure, day after day, is genuinely CPU-constrained. The same reading appearing once during a deploy or a backup job means nothing. A single `uptime` run cannot tell you which of these you are looking at — you need the trend over time, which is exactly what a one-off SSH check will never give you. CloudStick's dashboard graphs CPU, RAM, and disk over time using Zabbix Agent 2, so you can look at the last 7 or 30 days of load rather than a single moment and see whether the pressure is constant, growing, or only tied to specific events like backups or cron jobs.

PHP-FPM and MySQL Hitting Ceilings During Normal Traffic

PHP-FPM hitting its configured `pm.max_children` ceiling during ordinary, everyday traffic — not a launch day or a marketing spike — means the server cannot serve its normal request volume with the workers it has. The same logic applies to MariaDB: if the slow query log keeps filling up after you have already optimized the queries and added the right indexes, the database has run out of the CPU or I/O headroom needed to serve them fast, not a query design problem.

grep "max_children" /home/<username>/logs/<sitename>/php83cs-fpm/error.log | tail -20
# repeated "server reached pm.max_children" during normal hours = ceiling hit
mysql -e "SHOW VARIABLES LIKE 'max_connections';"
mysql -e "SHOW STATUS LIKE 'Threads_connected';"
mysql -e "SHOW VARIABLES LIKE 'slow_query_log_file';"
wc -l /var/log/mysql/mariadb-slow.log

The key qualifier both times is "during normal traffic." Every stack hits its configured limits under a genuine spike — that is what limits are for. The signal you actually want is these ceilings getting hit on an ordinary Tuesday afternoon, repeatedly, over days. CloudStick's Web Application Logs surface these PHP-FPM and slow-query patterns per site without needing to SSH in and tail files manually, which makes it much faster to confirm whether a ceiling is being hit occasionally or constantly.

TTFB Creeping Up Over Weeks

Time to first byte that rises gradually over weeks, without any corresponding code deploy, plugin install, or traffic spike, points at capacity rather than a regression. A sudden jump right after a deploy is a code problem; a slow, steady climb with no obvious trigger is the server running out of headroom as data, users, or background jobs accumulate.

curl -o /dev/null -s -w 'ttfb: %{time_starttransfer}s total: %{time_total}s\n' https://example.com
# run this weekly and log the result somewhere you can compare over time

A single TTFB number tells you almost nothing on its own — you need a series measured the same way, at similar times of day, across several weeks. If that series is flat, whatever feels slow today is probably an isolated event. If it is climbing steadily alongside rising load average, nonzero swap, or a growing slow-query log, the pieces corroborate each other and point at the same conclusion: the server has less spare capacity than it used to.

False Signals That Don't Mean You Need a Bigger Server

A one-time traffic spike from a viral post or a single marketing email is not evidence you need more hardware — it is evidence your server briefly handled more load than usual, which is a different thing entirely. If load average and TTFB return to their normal baseline once the spike passes, the server did its job.

A single slow plugin or an unindexed query named specifically in your slow query log should be fixed or removed, not compensated for with a bigger server — throwing more CPU at a query missing an index just makes the same wasteful query run somewhat faster while still consuming resources it never needed to. Likewise, a misconfigured cache — an object cache like Redis that is not actually connected, a page cache that is disabled or bypassed on every request, static assets not offloaded to a CDN — should be fixed at the configuration level. Adding hardware on top of a broken cache just means you are paying more to mask a bug that is still there.

The Decision Rule: Optimize First, Upgrade Last

If you have not already tried caching, query optimization, and CDN or static-asset offloading, try those first — hardware is the last lever you pull, not the first. Each of those fixes typically buys back far more headroom per hour of work than a hardware upgrade does, and they fix the actual problem instead of paying to outrun it.

PREREQUISITE

Before you resize a server, confirm three things: object caching (Redis) is actually connected and being hit, the slow queries named in your MySQL slow log have been optimized or indexed, and static assets and images are served from a CDN rather than PHP-FPM. If any of these has not been done yet, do it first — it is very common for a server that "needs upgrading" to be fine once these are addressed.

Once caching, query optimization, and offloading are genuinely in place, and the signals from the previous sections are still trending the wrong way over days or weeks — sustained load above core count, nonzero swap, disk with nothing left to reclaim, PHP-FPM or MySQL hitting ceilings on ordinary traffic, TTFB climbing with no code change — that is when a bigger server is the correct fix, not a workaround. CloudStick prices per server rather than per site, starting at $9/mo for a typical 4 vCPU / 8GB RAM / 150GB disk box, so resizing to the next tier up is a single decision rather than a per-site cost calculation, and the same dashboard trend graphs that told you it was time will confirm afterward that the new headroom actually holds.

Leave a comment
Full Name
Email Address
Message
Contents