Explanation
Why the waste happens and who it affects.
Google's pricing page puts it plainly: a 1 TiB instance holding 100 GiB of data is charged for the full 1 TiB. Instances are often sized for projected growth, for peak throughput on tiers where performance scales with capacity, or at a tier minimum (1 TiB for Basic HDD and Zonal, 2.5 TiB for Basic SSD), and are often not reduced once the data settles at a much smaller footprint.
The waste persists because scaling down is not possible on every tier and is easy to forget on the tiers where it is. Zonal, Regional and Enterprise instances can be scaled up or down while in use, but Basic HDD and Basic SSD can only grow. Instances with custom performance also bill provisioned IOPS separately, which can be set higher than the workload needs. Typical cases are shared home directories, CI caches, GKE ReadWriteMany volumes and lift-and-shift NFS workloads.
Billing model
The pricing dimensions that drive this cost.
Filestore is charged per second from instance creation; rates vary by tier and region.
- Provisioned capacity
- Billed per GiB of provisioned capacity whether or not it holds data
- Custom performance
- When enabled, billed as a per-instance charge plus per-GiB capacity plus provisioned IOPS; it cannot be turned off once enabled
- Tier minimums
- Each tier has a minimum instance size, so small data sets on high-minimum tiers pay for unused capacity
- Backups
- Billed separately per GiB of stored, compressed and incremental backup data
How to detect
4 checks to find it in your estate.
- Compare file.googleapis.com/nfs/server/used_bytes with provisioned capacity, or chart nfs/server/used_bytes_percent, per instance and file share over at least 30 days
- Flag instances whose used space stays well below provisioned capacity, and note the tier, since Basic HDD and Basic SSD cannot be scaled down in place
- Check nfs/server/read_ops_count, write_ops_count and procedure_call_count for instances with little or no client activity, which may be idle rather than just oversized
- For custom performance instances, compare provisioned IOPS with observed operations; include snapshots_used_bytes, since snapshots consume instance capacity
How to fix
4 ways to remove the waste.
- Scale down Zonal, Regional and Enterprise instances with gcloud filestore instances update INSTANCE --file-share=name=SHARE,capacity=SIZE; scaling does not affect availability, but capacity cannot go below what existing data and metadata require
- For Basic tiers, which scale up only, create a smaller instance or a tier with a lower minimum and copy the data, then delete the old instance
- Lower provisioned IOPS on custom performance instances to observed needs plus headroom; capacity and IOPS can be changed at any time
- Delete idle instances after taking a backup, and consolidate many small GKE volumes onto Filestore multishares where supported
Documentation
Vendor references for pricing and configuration.