Reserving VM instances: the basics
What is Azure Advisor actually telling you to buy?
A pay-as-you-go virtual machine bills at the on-demand rate for every hour it runs, whether it ran for an afternoon or has run continuously for two years. The on-demand rate is the price of flexibility: you can stop the machine at any moment and stop paying. For a workload that is never going to stop, a steady production fleet that runs at the same size month after month, that flexibility is something you are paying for and not using. An Azure reservation is the way to hand the flexibility back in exchange for a lower rate. You commit to a specific virtual machine size in a region for one or three years, pay either monthly or upfront, and the reservation discount applies automatically to any matching machine that runs.
Azure Advisor turns this into a concrete recommendation: 'Consider virtual machine reserved instance to save over the on-demand costs' (recommendation ID 84b1a508-fc21-49da-979e-96894f1665df, on the subscription resource type). Advisor analyses your actual virtual machine usage over a look-back window, identifies the sizes you run consistently, and tells you how many instances of each to reserve and what you would save. The recommendation does not change anything on its own. It is a prompt to convert steady, already-committed usage into committed pricing.
The work is not 'buy reservations'. It is to separate the virtual machines that genuinely run steady-state from the ones that scale up and down or get torn down between sprints, reserve only the steady base, and pick the term and scope that match how confident you are. Reserve too little and you leave money on the table; reserve a machine you are about to retire and you have committed to capacity you no longer need. The capability is matching commitment to the part of the fleet that was never going anywhere.
In this lesson you will learn how Azure prices steady compute, how Advisor identifies which virtual machines are worth reserving, and how to buy the right reservation, the right size, term, scope and instance size flexibility, without committing to capacity you are about to retire. The walkthrough uses the az CLI to read the recommendation, price a reservation before buying, and place the order.
Paying a deposit you never get back
The on-demand rate on a cloud virtual machine is best thought of as a standing option premium: you pay extra, every single hour, for the right to switch the machine off at a moment's notice. For a development box you spin up and tear down, that option is worth every penny. For a production database server that has run continuously since the day it was deployed and will run for years more, you are buying that option afresh every hour and never once exercising it. A reservation is simply you telling Azure you will not be exercising the option, and Azure handing back most of the premium in return. The machine does not change. Only the price does.
Finding what is worth reserving across a subscription
Priya runs the platform team at a SaaS company whose Azure bill has grown with the product. Cost Management shows compute as the largest line, and most of it is a stable production fleet that has not changed size in months. Azure Advisor is surfacing the virtual machine reservation recommendation on two of their subscriptions.
Rather than buy reservations from the portal estimate alone, Priya starts by pulling the Advisor recommendation and listing the running machines, so she can separate the steady base load that is worth reserving from the autoscaled and short-lived machines that are not.
Pull the Advisor cost recommendations for the subscription and look for the virtual machine reservation prompt. This is the same recommendation the portal shows, read straight from the API.
Advisor flags the opportunity and its size, but it is per subscription. Before buying, confirm which machines actually run steady-state so you reserve the base, not the peak.
How an Azure VM reservation actually applies the discountdeep dive
A reservation is a billing construct, not a compute resource. When you buy one you choose a virtual machine size (the SKU, for example Standard_D4s_v5), a region, a quantity, a term of one or three years (P1Y or P3Y), and a scope. You do not attach it to a specific machine. Each hour, Azure looks for running virtual machines that match the reservation's attributes within its scope and applies the discounted rate to them automatically; any matching usage above the reserved quantity falls back to the on-demand rate. If no matching machine runs in a given hour, that hour of the reservation is simply unused.
Two settings decide how widely the discount lands. Scope can be a single subscription, a resource group, a management group, or shared across the whole billing context: a shared scope lets one reservation soak up matching usage anywhere in the enrolment, which keeps utilisation high. Instance size flexibility, when on, applies the discount across other sizes in the same VM size group rather than only the exact SKU you bought, using a published ratio, so a reservation for a smaller size can cover a larger one and vice versa. By default, when the scope is shared, instance size flexibility is on, which is what makes a reservation forgiving of routine resizing.
Because the discount is matched per hour against whatever is running, the saving you actually realise tracks the reservation's utilisation. A reservation that sits over a machine running twenty-four hours a day returns close to its full value; one bought against a machine that gets switched off returns less. This is why the inventory step matters more than the purchase step: the discount is real, but it only pays out on the hours a matching machine is actually running.
What is the impact of leaving steady VMs on the on-demand rate?
The direct impact is straightforward: you pay the on-demand premium, every hour, on capacity you were always going to run. Microsoft documents reserved virtual machine instance discounts reaching up to 72 per cent against pay-as-you-go for the deepest commitments, so for a large, stable production fleet the gap between the on-demand rate and the reserved rate compounds into a significant recurring overspend. Unlike most optimisations this one requires no change to the workload, no resizing, no re-architecting, just a change to the rate you pay for what already runs.
The second-order impact is that the overspend is invisible by default. An on-demand machine does not flag itself as expensive; it just quietly bills at full rate. Advisor is the thing that surfaces the gap, and if nobody owns the recommendation it persists indefinitely. Every month a steady machine stays on the on-demand rate is a month of saving that cannot be recovered retroactively, because the discount only applies from the moment the reservation is bought forward.
There is a real but bounded risk on the other side, which is why this is a decision and not an automatic action. Commit to a size or a workload that then changes, and you hold a reservation that is not fully utilised. Microsoft mitigates this with instance size flexibility, which lets the discount cover neighbouring sizes, and with self-service exchange and refund, so an over-bought or stranded reservation can usually be exchanged or partially returned within published limits rather than wasted. The impact of getting it wrong is therefore a recoverable inefficiency, not a sunk loss.
How do you buy the right reservation safely?
Work this as a portfolio decision, not a single purchase. The order matters: confirm what is genuinely steady before you commit, price the reservation before you buy it, and match term and scope to confidence so you are reserving the base load rather than the peak.
1. Read the recommendation and confirm the steady base
Start from Advisor's virtual machine reservation recommendation, then cross-check it against what actually runs continuously. Advisor sizes its estimate from a look-back window, so a fleet that was temporarily large can be over-recommended. List your running machines by size and reserve below the steady minimum, never above the peak, so the reservation stays fully utilised.
2. Choose term and billing plan by confidence
A one year term (P1Y) paid monthly is the low-risk default: short commitment, the monthly bill simply drops. A three year term (P3Y), and paying upfront, saves more but commits the size and the workload for longer. Put the most durable machines, the core database and API tiers, on the longer term, and the merely-probable ones on the shorter.
3. Set scope and instance size flexibility to keep utilisation high
Prefer shared scope so the discount follows matching usage across subscriptions in the billing context rather than stranding on one. Leave instance size flexibility on for virtual machines so routine resizing within the same VM size group still draws the discount. These two settings are what stop a correctly-sized reservation from going unused after a routine change.
4. Price it, buy it, then monitor utilisation
Always run the calculate step before purchasing so the commitment and saving are confirmed against the live catalogue, never a stale estimate. After buying, track reservation utilisation as an ongoing metric: any reservation persistently below full use is a candidate to exchange or partially refund through Microsoft's self-service process rather than leave stranded.
# 1. Confirm the steady base: list running VMs by size before committing.
az vm list -d --query "[?powerState=='VM running'].{name:name, size:hardwareProfile.vmSize}" -o table
# 2. Price the reservation against the live catalogue BEFORE buying.
# Reserve below the steady minimum, not the peak. Shared scope + size
# flexibility keep utilisation high. (Requires: az extension add --name reservation)
billing_sub="<billing-subscription-id>"
az reservations reservation-order calculate \
--reserved-resource-type VirtualMachines \
--sku Standard_D4s_v5 \
--location eastus \
--quantity 3 \
--term P3Y \
--billing-plan Monthly \
--applied-scope-type Shared \
--billing-scope "$billing_sub" \
--instance-flexibility On \
--display-name prod-d4sv5-3yr
# 3. Place the order once the calculated price and saving look right.
az reservations reservation-order purchase \
--reservation-order-id "$(cat /proc/sys/kernel/random/uuid)" \
--reserved-resource-type VirtualMachines \
--sku Standard_D4s_v5 \
--location eastus \
--quantity 3 \
--term P3Y \
--billing-plan Monthly \
--applied-scope-type Shared \
--billing-scope "$billing_sub" \
--instance-flexibility On \
--display-name prod-d4sv5-3yr Quick quiz
Question 1 of 5Azure Advisor surfaces 'Consider virtual machine reserved instance to save over the on-demand costs'. What is the most efficient way to act on it?
You scored
0 / 5
Keep learning
Go deeper on how Azure prices reserved virtual machines and how to size, scope and manage the commitment.
- Prepay for Azure virtual machines to save money How reserved VM instances work, what they discount, and how to buy one.
- Manage Azure Reservations Change scope, split a reservation, and set instance size flexibility to keep utilisation high.
- Self-service exchanges and refunds for Azure Reservations How to exchange or refund a reservation whose workload has changed, and the published limits.
You can now treat reserved virtual machine instances as one capability: read Advisor's recommendation, confirm which machines genuinely run steady-state, reserve the base load below the peak, and match term, scope and instance size flexibility to how confident you are, pricing the order before you place it and watching utilisation afterwards. The same machines keep running unchanged, they just stop paying the on-demand premium on usage that was never going anywhere.
Back to the library