Why Hourly VM Price Comparisons Keep Lying to Me
If you’ve ever tried to optimize cloud spend by simply comparing the hourly price of virtual machines (VMs) across AWS, Azure, and Google Cloud, you’re likely to run into frustrating results that fall short of expectations. Hourly pricing, on its own, is an unreliable compass—pointing you towards savings potentials that evaporate when you factor in the nuances of cloud billing and real-world usage patterns.
Having managed cost reviews on staging fleets, internal tools, and high-throughput worker queues for over a decade across multiple cloud platforms, I’ve learned to never trust surface-level prices. In this blog post, I’ll share why hourly VM price comparisons often “lie” to you, how always-on small services cloak massive cloud waste, and why tools like AWS Compute Optimizer and Azure Advisor only tell part of the story. I’ll also cover what metrics you should really monitor, why bundled storage and included data transfer make big differences, and how billing rules silently shape your true costs.

Hourly Price, The Surface-Level Metric
When teams start a cloud cost optimization initiative, one common approach is to:
- Look up the raw hourly price of a VM type, e.g., AWS t3.medium at $0.0416/hr.
- Compare that price across similar VM types (Azure B2s, GCP E2-standard-2, etc.).
- Choose the cheapest and migrate to save money.
Fantastic, right? Unfortunately, the devil is in details that hourly prices can’t show. Let me break down why.
1. Different Clouds Bundle Storage and Network Transfer Differently
A VM's hourly price often includes a baseline of bundled resources, but the definition varies by provider. For example, AWS EC2 pricing includes instance compute but excludes EBS storage and data transfer, which are billed separately.
Azure VMs often have storage or IOPS included or discounted within the SKU, depending on the family, while Google Cloud VMs can bundle persistent disk storage differently on sustained use discounts.
That means a cheap hourly VM with "no storage" included may cost significantly more when you add the persistent disk and transfer charges. Ignoring these bundled storage and included transfer items gives you incomplete — and misleading — cost insights.
2. Billing Rules Mask the True Cost Over Time
Cloud billing is notorious for complex, provider-specific rules such as:
- Minimum billing increments (e.g., per second vs. per minute).
- Network egress tiers or free quotas.
- Interruptible instances and spot pricing variability.
Hourly price comparisons neglect such nuances, causing estimates to diverge wildly once you run an actual workload.
Why Always-On Smaller Services Hide Your Cloud Waste
Many developers treat smaller VM types as "cheap enough" to run constantly, assuming they scale down cost naturally during lull times. This “always-on” practice quietly accumulates waste from:
- Idle CPU cycles that never materialize into real workload.
- Static attached storage and persistent IP or load balancer charges.
- Unused but reserved capacity causing unnecessary fees.
This is especially bad for services that spin up as part of internal tooling, monitoring agents, or background workers that barely peak yet never stop running.
The bottom line? Small VMs do not guarantee small bills. Always-on, underutilized compute can silently grow your cloud expenses.
Shared vCPU Means Different Things Across Providers
One of my pet peeves is how teams treat vCPU counts as direct performance guarantees. But shared CPU definitions differ wildly between AWS, Azure, and GCP:
Cloud Provider vCPU Definition Implications AWS T-series (e.g., T3, T4g) Shared physical CPU with CPU credits, bursting allowed Baseline CPU with burstable credits; performance varies with workload credit usage Azure B-series Shared CPU credits with burst capability Similar to AWS T-series but different bursting algorithms and credit accumulations GCP E2 series Shared underlying cores but billed as full vCPU Shared cores but often better baseline performance; billing not tied to burst creditsWhat’s the takeaway? vCPU is not a uniform metric or performance promise. Understanding the platform-specific CPU sharing and bursting mechanism is crucial before blindly switching instances.
Measure Peaks with the Right Observation Window
If average CPU utilization is your benchmark, you’re missing key signals. Performance bottlenecks and cost overruns happen at peak times, which are often brief but critical.
Before changing VM types based on average CPU, answer: What do P95 and P99 utilizations look like? How long do these spikes last? These percentiles give you a better grasp of peak load scenarios.
An example: If average CPU hovers around 20% but your P99 spikes shoot to 90% for 10 seconds every 10 minutes, dropping to a smaller VM could trigger latency or errors during those spikes.
Using Percentiles & Spike Duration
To optimize correctly, track these metrics over a suitable window: minimum 1-4 weeks of data, segmented by hour or workload type:
computingforgeeks- P50 (Median): Typical but not informative alone for peak demand
- P95: Common peak usage levels that systems should endure without degradation
- P99 and higher: Rare but severe load spikes that could cause outages without headroom
- Spike Duration: How long those peak demands last – short bursts might be handled by bursting CPU credits, longer might require bigger instances
Why AWS Compute Optimizer and Azure Advisor Are Only Part of the Picture
Both AWS Compute Optimizer and Azure Advisor are excellent starting points to identify VM sizing opportunities. However, they have their limits:
- Observation windows: By default, sometimes only cover the last 14 days or less, missing seasonal or workload variations.
- Focus on averages and medians: Default recommendations lean heavily on average utilization rather than tail latencies or peak percentiles.
- Ignore bundled storage and network: They rarely account for attached disk billing or network egress costs impacting overall spend.
- Performance constraints: They don’t reflect actual latency or I/O demands—only CPU and memory utilization.
Therefore, while these tools help identify obvious underutilization and suggest alternative sizing, the final cost decision must consider billing complexities, workload characteristics, and peak demand behaviors.
Putting It All Together: Best Practices for Honest VM Cost Comparisons
Here’s a checklist to keep you honest with VM cost comparisons, avoiding the traps of naive hourly price approaches:
- Include Bundled Storage and Transfer in Cost Models: Don’t just compare instance prices; add attached persistent storage costs and typical network egress charges by provider.
- Understand Billing Rules: Factor in minimum billing increments, spot interruptions, data transfer tiers, and regional pricing variations.
- Use Percentile Metrics (P95, P99) and Spike Durations: Analyze workload metrics over at least 30 days to understand peak resource needs, not just averages.
- Interpret vCPU Counts with Provider Context: Don’t assume vCPU = physical core. Know how bursting or shared CPU affects performance and uptime.
- Audit Always-On Small Services: Identify low-use but always-on workloads to eliminate hidden waste.
- Test Changes with Clear Rollback Criteria: Pilot VM type changes with SRE-grade monitoring to ensure performance and cost targets are met before full rollout.
Conclusion
Hourly VM pricing rates remain a popular lens for cloud cost decisions due to their simplicity. However, this simplicity is deceptive. The interplay of bundled storage, included transfer, intricate billing rules, and workload peak characteristics means a cheap hourly price rarely translates into cheap effective cost.

Always-on services quietly inflate bills more than expected. Shared CPU definitions vary and impact performance reliability. And using average CPU metrics is the fastest route to a costly mistake.
Use tooling like AWS Compute Optimizer and Azure Advisor as directional aids — but always complement their insights with detailed percentile-based workload analysis, a deep understanding of billing subtleties, and rigorous performance testing.
Only then will your cloud cost optimization efforts move beyond surface-level myths and into actionable, real savings.