Back to Blog
gcp
cost-optimization
idle-resources
recommender
cleanup

Finding and Eliminating Idle GCP Resources (2026)

A practical guide to finding and cleaning up unused GCP resources. Learn to use Recommender, audit manually, and prevent waste from accumulating.

Matias Coca|
6 min read

Idle resources are pure waste. That test VM from three months ago? Still running. The disk from a deleted instance? Still charging. The static IP you reserved "just in case"? Still costing money.

These forgotten resources accumulate silently. Most companies discover 10-20% of their cloud spend is waste—resources running but unused.

This guide shows you how to find idle resources, safely eliminate them, and prevent the problem from recurring.


The Cost of Idle Resources

Before hunting for waste, understand what you're looking for:

Resource TypeTypical Monthly CostHow It Goes Idle
Idle VM (n2-standard-2)$50-100Test environment forgotten
Unattached persistent disk (100GB SSD)$17VM deleted, disk kept
Unused static IP$7.30Reserved but not attached
Idle Cloud SQL (db-n1-standard-1)$50-150Dev database not used
Old snapshots (100GB)$2-5Backup policy without cleanup
Unused load balancer$18+Service deprecated
Compound effect: A single forgotten n2-standard-4 VM costs ~$150/month. Over a year, that's $1,800 wasted. Multiply by the typical number of forgotten resources, and waste adds up fast.

Method 1: Google Cloud Recommender (Free)

Google's Recommender uses machine learning to identify waste automatically. Start here.

How to Access Recommender

Console path: Search "Recommendations" in the Console search bar, or navigate to Home → Recommendations in the left sidebar

Or by service: Compute Engine → VM instances → look for recommendation icons (lightbulb) next to individual resources

Types of Cost Recommendations

RecommendationWhat It FindsThreshold
Idle VMVMs with very low CPU<5% CPU for 14+ days
Idle persistent diskDisks not attachedUnattached for 30+ days
Idle Cloud SQLDatabases with no connectionsLow connections for 14+ days
Oversized VMVMs using fraction of capacity<50% CPU utilization
Idle IP addressReserved IPs not attachedNot attached to resource

Recommender Limitations

  • Only surfaces obvious waste (thresholds are conservative)
  • Must check manually (no proactive alerts by default)
  • Doesn't catch all types of idle resources
  • Per-project view only

Method 2: Manual Audit Checklist

Recommender catches obvious waste. Manual audits catch the rest.

Compute Engine VMs

What to check:

  • VMs created months ago (old test environments)
  • VMs with generic names (test-vm-1, temp-instance)
  • VMs in dev/staging that should be stopped overnight

Verification: Check Cloud Monitoring for actual CPU usage over last 30 days.

Persistent Disks

What to look for: Disks not attached to any VM.

Common causes:

  • VM deleted but disk preserved
  • Snapshot restored but original disk kept
  • Manual disk creation that was never used

Static IP Addresses

What to check: IPs with status "RESERVED" (not attached to anything). You pay $7.30/month for each unused IP.

Snapshots

What to check:

  • Snapshots older than retention policy
  • Snapshots of deleted disks
  • Manual snapshots that were never cleaned up

Cloud SQL Instances

What to check:

  • Dev/test databases left running
  • Databases for deprecated applications
  • Oversized tiers for actual usage

Load Balancers

What to check:

  • Load balancers with no healthy backends
  • Load balancers for deprecated services
  • Duplicate load balancers


Method 3: BigQuery Analysis (If Billing Export Enabled)

If you have billing export to BigQuery enabled, you can find expensive idle resources directly.

Find Resources with Consistent Low Usage But High Cost

SELECT
  resource.name AS resource_name,
  service.description AS service,
  ROUND(SUM(cost), 2) AS monthly_cost
FROM your-project.billing_export.gcp_billing_export_resource_v1_XXXXXX
WHERE invoice.month = FORMAT_DATE('%Y%m', DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH))
  AND resource.name IS NOT NULL
GROUP BY resource_name, service
HAVING monthly_cost > 20
ORDER BY monthly_cost DESC
LIMIT 50

This query finds resources costing more than $20/month. Adjust the threshold based on your needs—use a lower value (e.g., > 10) for tighter cost control, or higher (e.g., > 50) to focus only on significant waste.

Cross-reference this list with actual usage in Cloud Monitoring.


Safe Deletion Process

Before deleting anything, follow this process to avoid incidents.

Step 1: Verify Resource is Actually Idle

Don't rely solely on metrics. Verify with:

  • Logs: Check Cloud Logging for recent access
  • Users: Ask the team if anyone uses it
  • Dependencies: Check if other services reference it

Step 2: Tag for Deletion (Don't Delete Immediately)

Add a label indicating planned deletion date. Wait at least a week.

Step 3: Stop Instead of Delete (For VMs)

For VMs, stop first. This eliminates compute cost while preserving the disk. Wait a week. If no one complains, proceed to delete.

Step 4: Create Snapshot Before Deleting Disks

Before deleting any disk, create a final backup snapshot.

Step 5: Delete and Document

After verification period, delete the resource. Document what was deleted, when, and why.


Prevention: Stop Waste Before It Starts

Finding idle resources is reactive. Prevention is better.

1. Enforce Labels on Resource Creation

Require labels for:

  • owner: Who created this (email)
  • environment: prod, staging, dev, test
  • expiry: When should this be reviewed

Use Organization Policy or Terraform validation to enforce.

2. Set Expiration Policies

For test/dev resources, set clear expiration:

  • Dev VMs: Auto-delete after 7 days
  • Test environments: Auto-stop nightly
  • Snapshots: Auto-delete after 30 days

3. Budget Alerts by Project

If a dev project suddenly costs more than expected, alert immediately. Don't wait for monthly reviews.

4. Monthly Cleanup Ritual

Add "resource cleanup" to monthly processes:

  • Check Recommender
  • Review resources older than 90 days
  • Audit unlabeled resources
  • Verify scheduled deletions completed

5. Use Ephemeral Environments

Instead of persistent dev environments, use:

  • Cloud Workstations (auto-stop after idle)
  • Ephemeral GKE namespaces
  • Terraform workspaces that destroy on PR merge


Key Takeaways

  1. Idle resources are typically 10-20% of cloud spend—worth finding
  2. Start with Recommender—it catches obvious waste for free
  3. Manual audits catch what Recommender misses
  4. Stop before delete—validate nobody needs it
  5. Automate enforcement—manual cleanup doesn't scale
  6. Prevent is better than cure—labels, expiration, ephemeral environments
The goal isn't a one-time cleanup. It's building habits and automation that prevent waste from accumulating in the first place.

Want automated idle resource detection across all your GCP projects? GCP FinOps surfaces idle resources and tracks cleanup progress.


Related Articles:

Written by Matias Coca

Building GCP cost optimization tools for growing companies. Questions or feedback? Let's connect.

Ready to optimize your GCP costs?

See exactly where your cloud spend goes with our cost optimization dashboard.