CephLXVI · Capacity ForecastingCapacity Forecasting
Retention and churn
What you'll learn
- Distinguish gross growth from net growth
- Model retention and churn separately
- Identify where retention policy is absent
- Forecast a cluster with defined retention
Prerequisites
None — start here.
Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18
Why this matters in production
A cluster ingesting 5 TB/day and deleting 4 TB/day grows at 1 TB/day. A forecast built on the ingest rate is wrong by a factor of five, and one built on net growth breaks the moment retention changes.
Gross and net
net growth = ingest rate − deletion rate
# net, from the cluster
rate(ceph_cluster_total_used_raw_bytes[14d]) * 86400
# gross ingest, from the application side
# RGW request logs, application metrics, or:
rate(ceph_rgw_put[14d])
Only the net figure predicts capacity. The gross figure predicts throughput requirements, which is a different planning question.
Modelling retention
A cluster with a defined retention period reaches a steady state:
steady state size = ingest rate × retention period
5 TB/day × 90 days = 450 TB
Once at steady state the cluster stops growing, which is the property that makes retention-governed workloads far easier to size. The date it reaches steady state matters as much as the size:
days to steady state = retention period (from the start of ingest)
Where retention is absent
| Data | Common state |
|---|---|
| RGW objects | lifecycle rules often not configured |
| RBD snapshots | created by backup jobs, rarely pruned |
| CephFS snapshots | same |
| Incomplete multipart uploads | almost never cleaned without a rule |
| Old RBD images from decommissioned VMs | frequently orphaned |
# is any lifecycle configured?
for b in $(radosgw-admin bucket list --format json | python3 -c 'import sys,json;[print(x) for x in json.load(sys.stdin)]'); do
echo -n "$b: "
radosgw-admin lc get --bucket="$b" 2>/dev/null | head -1 || echo 'none'
done
# snapshots by age
for i in $(rbd ls rbd-vms); do rbd snap ls rbd-vms/$i; done | wc -l
Data without retention grows without bound, so any forecast for it is a forecast of when the cluster fills rather than of a steady state.
Forecasting with retention defined
pool: rgw-buckets
ingest: 5 TB/day
retention: 90 days (lifecycle rule, verified active)
steady: 450 TB logical, ×1.5 EC = 675 TB raw
reached: 90 days after the rule took effect
pool: rbd-vms
ingest: 0.8 TB/day net
retention: none — VM disks persist
steady: none; grows indefinitely
forecast: linear, exhaustion at current MAX AVAIL / 0.8 TB
Stating “retention: none” explicitly is what turns an unbounded pool from an oversight into a decision.
Quiz
Knowledge check · 4 questions
Q1. A pool ingests 5 TB/day with a verified 90-day lifecycle rule. What is its steady-state logical size?
Q2. A cluster ingesting 5 TB a day can be growing at 1 TB a day, and only the second figure belongs in a capacity forecast.
Q3. Build a forecast for a mixed cluster.
A cluster hosts an RGW pool with a 90-day lifecycle rule, an RBD pool for persistent VM disks, and a CephFS pool whose snapshots are created nightly and never pruned.
Q4. Why can a short measurement window distort a growth rate?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Record every pool’s retention policy explicitly, including “none, by design” — the unbounded pools are what determine the expansion date and they are usually unbounded by omission. Forecast on net growth over a fourteen-day window, since asynchronous reclamation distorts shorter samples.
Cross-course references
- Kubernetes: log and metric retention drives the same steady-state calculation
- Linux: logrotate policies are the difference between bounded and unbounded growth