Explanation
Why the waste happens and who it affects.
But the VM's resources remain: its boot and data disks keep billing for their full provisioned size, a static external IP assigned to it keeps billing as an in-use address, and preserved Local SSD data keeps billing for the durable storage that holds it. Because the instance itself shows no compute cost, VMs stopped as a precaution are easily left in the TERMINATED state for months.
The longer a VM stays stopped, the less likely it is to be restarted, and the residual storage and address cost becomes pure waste. Typical sources are migrations, incident investigations, project wind-downs and dev projects where VMs are stopped instead of deleted. Suspended VMs have the same issue plus a memory charge, until Compute Engine moves them to TERMINATED after 60 days.
Billing model
The pricing dimensions that drive this cost.
- Attached disks
- Persistent Disk and Hyperdisk volumes attached to a stopped or suspended VM are billed for provisioned capacity (and Hyperdisk provisioned performance) as long as they exist
- Static IP on a stopped VM
- A static external IP associated with a stopped VM is still considered in use and billed hourly
- Preserved Local SSD data
- If Local SSD data is preserved on stop, the storage used to hold it is billed until the VM is restarted or deleted
- Suspended VMs
- Billed for memory, attached disks and static IPs, with no vCPU charge, for up to 60 days
How to detect
4 checks to find it in your estate.
- List instances in the TERMINATED state (gcloud compute instances list --filter="status=TERMINATED") and use lastStopTimestamp to find VMs stopped longer than an agreed threshold, for example 30 days
- For each long-stopped VM, sum the provisioned size and type of its attached disks and note any static external IP assigned to it
- Include SUSPENDED instances, which also bill for memory
- Check owner labels and ask owners whether a restart is planned; the idle disk recommender does not flag disks that are still attached to a stopped VM
How to fix
4 ways to remove the waste.
- For VMs that will not be restarted, create a machine image or snapshot the disks if the state may be needed, then delete the VM with its disks
- Release static external IPs from long-stopped VMs if nothing depends on the address; an unattached reserved address is billed at a higher rate, so release it rather than just detaching it
- Move retained backups of long-stopped VMs to archive snapshots when they are kept only for compliance (90-day minimum storage charge applies)
- Add a policy, for example a scheduled script or label-based review, that flags or deletes VMs stopped beyond a set number of days
Documentation
Vendor references for pricing and configuration.