# GCP Disk SSD with Low IOPS

> GCP pd-ssd persistent disks whose combined read and write average stays below 100 operations per second over a 42-day lookback are recommended for pd-balanced. Savings derive from the authoritative pd-ssd to pd-balanced SKU rate delta; missing metrics or missing regional rates make the rule abstain.

Source: https://zop.dev/integrations/gcp/recommendations/gcp-disk-ssd-with-low-iops
Updated: 2026-08-19

---

## pd-ssd disks with read and write ops

- resource.Metadata: disk_type (must be pd-ssd; producer writes meta["disk_type"], not Tags)
- MetricsAware (EvalContextRule): GCPDiskReadOps + GCPDiskWriteOps over 42 days (both required; missing either = data gap → abstain)
- PricingAware + SKURatesAware: per-resource cost + pd-ssd / pd-balanced SKU rates (the exact catalog codes the GCP pricing extractor emits)

## The 100 ops per second ceiling

```text
diskTypeOptLowOpsCeiling=100 ops/sec (read avg + write avg), 42-day lookback
```

## Pricing the pd-ssd to pd-balanced move

concrete-or-abstain (cost-driven rightsizing). The prior hardcoded diskTypeOptSavingsFraction=0.30 fallback is removed. savings = model.DeriveCatalogDiffSavings(srcRate, dstRate, cost, 0) from provider-authoritative pd-ssd→pd-balanced SKU rates; with the 0 fallback, absent or out-of-band rates yield 0, so the rule abstains (returns nil) rather than fabricating a published delta. (Corrected 2026-07-02): RC-1234 does not have a permanent producer gap. fetchSKURates in internal/service/service.go skips a resource only when r.InstanceType == "" || r.Provider == "" || r.Region == "", and a GCP disk's InstanceType is not always empty, because the discoverer's enrichGCPDisk (asset_inventory.go) sets r.InstanceType = lastSegment(type) (e.g. "pd-ssd") from the same source field that stamps meta["disk_type"]. So for the pd-ssd disks this rule gates on, that skip does not fire: SetSKURates flips HasSKURatesAware("gcp","disk") to true and TargetSKUCandidates(["pd-ssd","pd-balanced"]) seeds both rates into the bulk rate fetch. If srcRate/dstRate still resolve to 0 in production, the cause is missing pd-ssd/pd-balanced coverage in pricing_cache for that disk's region, not a missing InstanceType. (disk_type was already read from Metadata, so the only defect fixed in-rule was the hardcoded fraction; this update only corrects a stale in-code comment that had misdiagnosed a non-existent producer gap.) Remediation is advisory only (manual snapshot→recreate→reattach; no TargetSpecRecommender).

## Reading disk IOPS in Cloud Monitoring

1. Review disk IOPS metrics in Cloud Monitoring

## Read and write ops over 42 days

GCPDiskReadOps, GCPDiskWriteOps (42-day lookback)
