Part VI · Chapter 12 · The Decisions · lesson 3
Defending the monthly bill to somebody who can read
15 min
Builds on What one request costs you, in cents and Why it gets slow at 70% busy, not at 100%
Part VI · Chapter 12 · The Decisions · lesson 3
15 min
Builds on What one request costs you, in cents and Why it gets slow at 70% busy, not at 100%
Your finance partner has the cloud invoice open, sorted descending, and has highlighted four lines. She is neither hostile nor naive: she reads this every month, and she has noticed two lines that grew while customer count did not.
Her first question is the one engineers lose:
"The servers are forty per cent busy. What are we buying with the other sixty?"
Predict
A composite monthly bill for the ten-thousand-business version of a product. Eight lines, about thirty-eight thousand dollars. The third column is the one that decides the conversation.
LINE MONTHLY WHAT IT BUYS IF REMOVED
-------------------------------- -------- ---------------------- -----------------------------
Application compute, 24 instances $9,200 Serving traffic with Losing one zone at peak
across three zones a zone's worth spare becomes an outage
Managed primary + hot standby $6,800 Minutes of recovery Zone failure means restore
(multi-zone) instead of hours from backup, data since lost
Non-production: dev, staging, $7,400 Three production-shaped Engineers use smaller shared
demo, all on all the time copies, idle 128h/week environments; nobody notices
Observability: log ingest, $6,100 Full-fidelity logs and Incident diagnosis gets
traces, per-host agents traces, 90-day tier slower; the 90-day tier is
read a handful of times a year
Object storage + CDN egress $3,500 Serving uploads and Pages get slower for distant
assets near the user users; origin bandwidth rises
Managed cache + managed broker $2,400 The availability page Database read load roughly
and four consumers triples; email delivery enters
the request path again
Cross-zone transfer + NAT $1,900 Nothing, directly. Zone redundancy is what buys
gateways It is the toll on the it; the lever is chattiness,
previous two lines not the line itself
Backups, snapshots, orphaned $700 Backups: recovery. Backups: no recovery.
volumes Orphans: nothing. Orphans: nothing at all.
-------------------------------- --------
TOTAL $38,000
Write that fourth column before the meeting, for every line, and the meeting goes differently — not because it wins the argument, but because of what it does to you while you are writing it. A line you cannot write a removal consequence for is a line you have just proved nobody will miss. The orphaned volumes and the third non-production environment do not survive the exercise, and they usually do survive the meeting, because in a meeting everything has a sponsor.
Non-production environments shaped like production, running all the time. Here it is three environments, each with its own multi-zone database, its own cluster and its own observability agents, in use during roughly forty hours of a hundred and sixty-eight-hour week. The defence that gets offered is parity, and the parity you have bought is topological rather than data-shaped: staging has production's diagram and a thousandth of its rows, so the things it catches are deployment-layer problems, which are problems the deployment layer introduced. The fix is boring and permanent — scheduled shutdown outside working hours, single-zone databases, smaller instance families, and one shared pre-production environment instead of three. Days of work, no customer impact, and the saving recurs every month for the life of the company.
Telemetry you have never queried. Full-fidelity traces on every request, debug-level application logs shipped and indexed, and a ninety-day retention tier that has been read a handful of times since it was configured. The defence offered is compliance, and it is almost always wrong about itself: the actual obligation names specific audit events — who logged in, who changed a permission, who exported data — and not the application's debug output. So keep that stream whole and long, and sample the rest: traces sampled with a rule that keeps everything slow or erroring, debug dropped at the agent rather than at the index, a short hot tier with the cold tier in object storage. What makes this line grow while customers do not is that every new service ships with its agent at defaults, and defaults are set by somebody paid per gigabyte ingested.
Both lines share the property that makes them indefensible: their cost is driven by a configuration default rather than by anything a customer does. That is the test. Walk the invoice and ask which lines move when traffic moves. The ones that do not are where the money is.
Back to the first question. Twenty-four instances, forty per cent busy. Why not fourteen?
Because utilisation is not headroom, and the relationship between the two is a curve rather than a ratio. Here is the arithmetic, with each request taking about twenty milliseconds of server time and a queueing budget of one hundred milliseconds.
Queueing delay
Hypothetical model, not a forecast
How long work waits in a single-server queue as utilisation rises, and the utilisation at which that wait breaks a stated budget.
It assumes
It ignores
Hold service time and the budget still. Raise the arrival rate until the queueing wait reaches the hundred-millisecond budget, then read the utilisation. That is the hard ceiling you are defending against.
Requests reaching the server each second.
How long one request occupies the server when nothing is queued.
The queueing wait that counts as too long. Service time is not part of it.
| Utilisation of one instance (per cent) | Time a request spends waiting before it is served |
|---|---|
| 1 | 202 us |
| 2 | 408 us |
| 5 | 1.1 ms |
| 10 | 2.2 ms |
| 20 | 5 ms |
| 30 | 8.6 ms |
| 40 | 13 ms |
| 50 | 20 ms |
| 60 | 30 ms |
| 70 | 47 ms |
| 80 | 80 ms |
| 85 | 113 ms |
| 90 | 180 ms |
| 92 | 230 ms |
| 94 | 313 ms |
| 95 | 380 ms |
| 96 | 480 ms |
| 97 | 647 ms |
| 98 | 980 ms |
| 99 | 1.98 s |
Not there yet — keep moving the controls.
Now the defence, in four lines a finance partner can check:
Cut the fleet from twenty-four to sixteen and the first three lines still hold in normal operation. The fourth does not: peak with one zone gone puts each surviving instance past capacity, the queue grows without bound, and the model reports it as overloaded rather than slow. That is the honest answer to "what are we buying with the other sixty per cent" — about seventeen points of queueing cliff, about twenty-eight points of surviving a zone failure, and about thirteen points of peak above average.
And here is the part that makes the defence honest rather than rhetorical: the third term is measurable and you should go and measure it. If your real peak-to-average ratio is one and a tenth rather than one and a third, you owe her instances back. The reason this argument works is that every term in it can be checked, which also means every term can be checked against you.
The standby database is the same argument in one sentence: it is not a second database, it is the difference between a zone failure costing minutes and costing however long a restore takes, with everything written since the last backup gone. Price it as insurance and the conversation becomes "what is an hour of lost bookings worth", which is a question she can answer better than you can.
What would you do
Something people say
“Our cloud bill is high because we are on the wrong provider, or because we have not optimised our instance types.”
Which line on the invoice above would a right-sizing tool be least likely to flag?
Check
The bill is the cheapest of the costs in this subject and it gets the most attention, for a structural reason: it arrives monthly, it is itemised, and somebody whose job it is reviews it. Engineering time has none of those properties. It arrives as an afternoon here and a day there, nothing aggregates it, and it never appears beside the roadmap item it displaced.
Which produces a common failure in cost meetings: every option gets priced in dollars, and the option that actually costs the most — a migration, a rewrite, a self-hosted replacement for a managed service — is the one whose price tag is written in the currency nobody tracks. A managed cache at two thousand dollars a month, replaced by one you operate, looks like a saving until you price the quarter of setup, the upgrades, the failover testing and the on-call attention against what those weeks would otherwise have shipped.
So the one number worth bringing that is not on the invoice: what fraction of your team's pull requests last quarter touched infrastructure rather than product. It takes an afternoon to count, it converts engineering time into something an invoice-reader recognises, and it is the only way the two currencies get compared in the same sentence.
Everything above assumes the bill is mostly usage, priced from a public rate card, where each line is a quantity you control multiplied by a price you do not. That is what makes the line-by-line walk worth an afternoon.
It stops being true when one contract dominates. A negotiated enterprise agreement with a committed annual floor, a per-seat licence for a vendor embedded in your product, a data provider with a minimum, a support tier priced as a percentage of spend: once one of those is over about half the total, the audit finds pennies. Worse, it can find negative pennies — reducing usage below a committed floor saves nothing at all, and right-sizing into a commitment you have already paid for is busywork that reads as diligence.
So the crossing is: when the largest single line exceeds roughly half the bill, or when more than about a third of spend sits under a multi-year commitment, stop auditing resources and start reading the contract. The levers there are different and mostly not technical — the renewal date, the commitment level, what the floor is, who at the vendor owns your account, and whether anybody has ever asked them for a better price. The arithmetic in this lesson still tells you what you need; it just stops telling you what you will be charged for it.