Exam Room · Cloud Practitioner

The Servers We Sized for One Tuesday in November

· 25 min read

Cloud Fundamentals · part of The Exam Room

The situation

An online retailer sells homewares. Its platform runs on 64 physical servers in a colocation facility: web tier, application tier, a database cluster, and a warehouse-integration tier that talks to two distribution centres.

The servers were specified in 2022 against the busiest hour the business had ever had, which was the Tuesday before a Black Friday campaign that went unexpectedly well. Average CPU utilisation across the fleet since then has been 8%. On the busiest hour of last November it reached 71%.

The hardware is due for refresh. A replacement round is quoted at AUD$780,000 in capital, depreciated over five years, plus the colocation contract at AUD$96,000 a year, plus two systems administrators whose time is roughly two-thirds hardware and platform work. The database runs a commercial engine under an enterprise agreement with three years left on it.

The finance director has looked at an EC2 price list, multiplied an hourly rate by 64 instances by 8,760 hours, arrived at a number larger than the depreciation line, and asked why anybody thinks this is cheaper.

What actually matters

The comparison the finance director ran assumes the fleet stays the same size. Remove that assumption and the arithmetic changes completely. Sixty-four servers exist because capacity had to be ordered ahead of demand nobody could measure, and the order had to cover the worst hour of the year. Where capacity is provisioned in minutes, the fleet sized for the worst hour only needs to exist during the worst hour. Eleven months at 8% utilisation is not a fact about the workload. It is an artefact of fixing the fleet size in 2022.

Second, the two sides of the comparison are different kinds of cost and behave differently when the business changes. The AUD$780,000 is fixed: it is committed whether the retailer has a good year or a bad one, whether the campaign works or flops. On-Demand instance hours are variable: a quiet January produces a smaller invoice with no action from anyone. That difference changes what a failed campaign costs, and what a successful one costs. For a business with seasonal revenue it often matters more than the headline hourly rate. AWS names the same shift as the first advantage of cloud computing: trade fixed expense for variable expense.

Third, the AUD$780,000 is not the cost of the current arrangement, it is one line of it. Colocation, power, cooling, network circuits, the spare parts shelf, the support contracts, the out-of-hours callouts and the two administrators are all part of what running this platform costs, and none of them appear in a per-hour price comparison. Getting the comparison right means putting the whole of one side against the whole of the other, which is what a total cost of ownership calculation is for.

Finally, the workload’s own shape has to be measured rather than assumed. Eight per cent average utilisation shows the fleet is oversized, but not by how much or in what dimension. A database that is memory-bound at 8% CPU is not oversized in the way a web tier at 8% CPU is oversized. Rightsizing is a measurement exercise, and it is continuous rather than a one-off, because a workload that is correctly sized in March is not automatically correctly sized in September.

What we’ll filter on

  1. Compares the whole cost of each option, including the costs an invoice does not show.
  2. Distinguishes what is committed in advance from what varies with usage.
  3. Handles a November peak roughly nine times the ordinary load without paying for it all year.
  4. Accounts for the commercial database licence with three years still to run.
  5. Reduces the administrator time spent on hardware rather than simply relocating it.

The landscape

Refresh the hardware as it is. AUD$780,000 of capital, another five-year cycle, and a fleet sized once more against a forecast peak. The number is known in advance, which finance departments like, and it is wrong in a predictable direction: too large for eleven months and possibly still too small if the business grows faster than 2022’s guess. Every subsequent change of mind waits for a procurement cycle.

Lift the same 64 servers to On-Demand instances. This is the comparison the finance director actually ran, and it is the worst of both arrangements: the fleet stays sized for November, and it is now billed by the hour at a rate that only makes sense with elasticity nobody is using. It does convert capital into operating expenditure and it does remove the hardware refresh, but the utilisation problem moves across untouched.

Rightsize, then run a small steady fleet with automatic scaling. Measure actual CPU, memory, network and disk per tier, size the baseline to ordinary demand, and let auto scaling add capacity when demand arrives. The November peak is then billed for the hours it exists. This is where the utilisation argument turns into money, and it takes work: measurement, load testing, and an application that keeps running while instances are added and removed.

Commit to part of the fleet. A Savings Plan commits to a consistent amount of compute usage, measured in dollars per hour, for a one-year or three-year term, and lowers the rate in return. A Reserved Instance commits to a specific instance configuration instead, which is why AWS now recommends Savings Plans over Reserved Instances. Either reintroduces a fixed cost deliberately, covering the part of the fleet that runs all year, while the peak stays On-Demand. That commitment stays fixed while everything around it varies, and it is where the mental model usually slips.

Replatform the database rather than rehosting it. Moving the commercial engine onto Amazon RDS removes the patching, the backup jobs and the failover rehearsals from the administrators’ week. The licence complicates it. An enterprise agreement with three years left is already paid for, and RDS supports bringing an existing one: Bring Your Own License for Oracle Enterprise Edition and Standard Edition 2, Bring Your Own Media for SQL Server Enterprise and Standard under License Mobility with Software Assurance. Terms counted in sockets or physical cores are the exception, because RDS does not expose the underlying hardware and RDS instances cannot run on Dedicated Hosts. License-included pricing folds the licence into the hourly rate, which suits a workload with no entitlement and is the wrong shape while the agreement is live.

Evaluation

Side by side

Option Whole-cost comparison Fixed vs variable understood Peak without year-round cost Fits the licence position Less hardware admin
Refresh the hardware Fixed throughout
Lift 64 servers to On-Demand Variable, unused
Rightsize plus auto scaling
Commit to the steady baseline
Replatform the database to RDS, BYOL n/a

The last three rows are not alternatives to each other. Rightsizing establishes what the steady baseline actually is, the commitment applies to that baseline once it is known, and the database replatform is a separate decision about a single tier. Committing before rightsizing is the ordering mistake, because it locks in a fleet size that the measurement is about to contradict.

What the comparison has to include

On-premises, per year Cloud, per year
Hardware depreciation (AUD$780,000 over five years) Instance hours for the steady baseline
Colocation space contract Instance hours for the scaled peak, for the hours it runs
Power and cooling Storage: volumes, snapshots, object storage
Network circuits and hardware Data transfer out
Spare parts and hardware support contracts Managed service charges (database, load balancing)
Administrator time on hardware and platform Administrator time on the remaining platform work
Capacity provisioned and never used Support plan
Software licences Software licences, or licence-included rates

Every row on the left that has no counterpart on the right is a cost the per-hour comparison omitted. The row at the bottom of the left column, capacity provisioned and never used, is the one carrying 8% utilisation for eleven months.

The solution

Start by measuring, because the argument cannot be settled without data. Instrument the existing fleet for a full seasonal cycle if the calendar allows it, and at minimum across a normal month and a peak week. What comes out is per-tier utilisation in four dimensions: CPU, memory, network and storage throughput. That is what turns “8% average” into a defensible instance size per tier, and it is what stops the rightsized fleet from being another guess.

Then separate the estate into the part that runs all year and the part that exists for November. The web and application tiers are the elastic part: size the baseline to ordinary weekday demand, put them behind a load balancer in an EC2 Auto Scaling group, and add instances with a dynamic scaling policy on a demand metric. A campaign with a known start date also warrants scheduled scaling, which changes the group’s capacity at a set time instead of waiting for the metric to climb. The peak is then instance-hours in November rather than a fleet that idles until then. The database and the warehouse integration are the steady part: they run at a similar shape all year and they are candidates for a commitment.

Take the commitment only after the measurement, and only against the steady part. A Savings Plan or Reserved Instances against the baseline lowers the rate on capacity that genuinely runs every hour. Leave the scaled peak On-Demand, because committing to capacity that exists for a hundred hours a year defeats the reason for scaling it. This is a deliberate reintroduction of a fixed cost, sized to the part of the workload that behaves like a fixed cost.

For the database, keep the enterprise agreement and bring the licence. Three years of entitlement is already paid for. Where the terms count vCPUs, the licence applies to an RDS instance directly. Where they count sockets or physical cores, the engine stays on EC2 and runs on Dedicated Hosts, which expose the number of sockets and physical cores those terms are written against. Revisit the choice when the agreement comes up for renewal, at which point license-included pricing or a move to an open-source engine becomes a live option rather than a write-off. Track the entitlements in AWS License Manager, which applies rule-based hard or soft limits on consumption, so a scaling event cannot exceed the entitlement unnoticed.

Rightsizing does not finish. Instance families change, workloads drift, and a tier that was correctly sized in March is not necessarily correctly sized in September. AWS Compute Optimizer reads configuration and CloudWatch utilisation metrics and returns rightsizing recommendations, over a 14-day window by default and 93 days with enhanced infrastructure metrics switched on. Cost Optimization Hub consolidates those rightsizing and idle-resource recommendations alongside Savings Plans and Reserved Instance recommendations; the rightsizing view in Cost Explorer covers EC2 alone. AWS Trusted Advisor flags low-utilisation EC2 instances, idle load balancers and idle RDS instances, though its cost checks need a Business Support+, Enterprise Support or Unified Operations plan. Put a recurring review in the calendar and treat it as ordinary operational work.

Finally, give the finance director the comparison they actually asked for. AWS Pricing Calculator is free, models the proposed architecture, and produces upfront, monthly and annual figures. Set that against the full on-premises figure: colocation, power, cooling, circuits, support contracts and administrator time, not the depreciation line alone. Migration Evaluator builds the same business case from collected utilisation data, and compares BYOL against license-included for the database as part of it. The honest version also names what changes. The cost becomes largely variable, so a bad quarter costs less and a good one costs more, and the figure is no longer known five years ahead.

What’s worth remembering

  1. A fixed cost is committed whether or not the resource is used; a variable cost moves with consumption. A Savings Plan or Reserved Instance commitment is a fixed cost sitting inside a variable model.
  2. Capital expenditure buys an asset up front and depreciates it; operational expenditure pays for a service as it is consumed, which is the shift a migration makes to the shape of the bill.
  3. A total cost of ownership comparison has to include the costs an invoice never shows: power, cooling, floor space, network hardware, spare parts, administrator hours, and capacity provisioned and never used.
  4. Rightsizing is continuous measurement rather than a one-off; Compute Optimizer produces the recommendations, Cost Optimization Hub consolidates them, and Trusted Advisor flags idle resources for accounts on a paid support plan.
  5. Amazon RDS supports bringing an existing Oracle or SQL Server licence, but terms counted in sockets or physical cores need EC2 Dedicated Hosts, which RDS instances cannot run on. License-included pricing folds the licence into the hourly rate and suits a workload with no entitlement.
  6. Aggregated usage from hundreds of thousands of customers gives AWS economies of scale a single organisation cannot reach on its own, and that is what makes the pay-as-you-go per-unit price lower.

These posts are LLM-aided. Backbone, original writing, and structure by Craig. Research and editing by Craig + LLM. Proof-reading by Craig.