Usage optimisation means paying for less: fewer, smaller or shorter-running resources that still meet the need. It is driven by engineering and is usually where the first and largest savings are.
flowchart LR IDLE["1. Remove idle and orphaned"] --> RS["2. Rightsize from metrics"] RS --> SCH["3. Schedule non-production"] SCH --> MOD["4. Modernise: newer types, ARM, serverless"] MOD --> TRK["Track savings realised"] %% step IDLE: Unattached volumes, old snapshots, idle load balancers, unused IPs: pure waste and low risk to remove. %% step RS: Use CPU, memory and network over two to four weeks to pick a smaller size or a better family. %% step SCH: Dev and test running 50 of 168 hours a week saves about 70% of their compute. %% step MOD: Newer generations and ARM (Graviton, Ampere, Axion) often give better price-performance. %% step TRK: Count only savings that were implemented, and check they stayed implemented.
Typical waste
| Waste | How to find it |
|---|---|
Unattached disks (EBS volumes available) |
aws ec2 describe-volumes --filters Name=status,Values=available |
| Unused public IPv4 addresses (billed hourly) | aws ec2 describe-addresses with no association |
| Old snapshots and images | Snapshots older than the retention policy |
| Idle load balancers, NAT gateways, databases | Near-zero requests or connections for weeks |
| Forgotten test environments | No owner tag, no deploys in months |
Rightsizing
- Use recommendations from AWS Compute Optimizer, Azure Advisor or GCP Recommender, plus your own metrics (memory needs an agent on many platforms).
- Look at peaks, not only averages; leave headroom for spikes.
- Change one step at a time and watch latency and errors.
Scheduling
Non-production rarely needs nights and weekends. Stop instances, scale node groups or databases to zero outside working hours with Instance Scheduler, Auto Scaling schedules, Azure Automation or simple pipelines. Running 10 hours × 5 days = 50 of 168 hours saves roughly 70%.
Make it a workflow
Recommendations → ticket for the owning team → change → verify savings. FinOps tracks savings identified vs realised; unactioned recommendations are the norm without ownership.
Traps: deleting "idle" resources without asking the owner (keep a snapshot, tag before delete, then delete); rightsizing on average CPU only; and one-time clean-ups with no policy, so waste grows back.