Why Ceph placement group counts matter from day one
Placement groups (PGs) are the units Ceph uses to map objects to OSDs, so the PG count of each pool decides how evenly data and load spread across the cluster and how much work each OSD does during recovery. Teams need to set PG counts deliberately when a new cluster will hold pools of very different sizes, such as a small metadata pool next to a large RBD or RGW data pool. Leaving every pool at a default count can leave the big pool under-spread and the small pools over-provisioned on paper.
The PG autoscaler can adjust counts for you, but it sizes pools from what it can see today. Its results are only as good as the growth hints you give it, particularly target_size_ratio for pools that will grow into a large share of raw capacity, and the bulk flag for pools that will hold most of the data. Before you enable any mode, confirm the expected share of each pool with the people who own the workloads, and write those assumptions down so they can be reviewed when the cluster changes.
The PG count also affects later change. More PGs per OSD mean smaller units of data to move during rebalancing and recovery, but they also add memory and peering overhead, and the upper limit is governed by settings such as mon_target_pg_per_osd, whose effect you should confirm for your Ceph release. Changing counts on a loaded production cluster is possible, but it generates data movement that competes with client I/O. Plan the first counts, the growth hints and the review point together, and check ceph osd pool autoscale-status before you accept any recommendation.
Autoscaler modes, growth hints and pool flags compared
This table compares the PG autoscaler modes, the growth hint for pools expected to expand, the bulk flag and the per-OSD PG target. Read each row for when the setting fits, what it changes in the cluster and the main way it goes wrong. Confirm default values and exact behavior against the Ceph release you deploy, because these settings have changed across releases.
| Setting | What it changes | When it fits | Main risk of misuse |
|---|---|---|---|
| Autoscaler mode off | The autoscaler does not change pg_num or pgp_num for the pool. You set PG counts by hand. | Teams that want full manual control and already run PG planning as a documented process. | PG counts drift from the cluster as OSDs are added or removed, and nobody notices until performance or balance suffers. |
| Autoscaler mode warn | The autoscaler reports recommended PG counts in autoscale-status and raises health warnings, but makes no changes itself. | Production clusters where a change window is required and an operator reviews each recommendation before applying it. | Warnings get muted or ignored, so the recommendation is never acted on and the pool stays undersized or oversized. |
| Autoscaler mode on | The autoscaler adjusts pg_num for the pool automatically based on observed usage and its targets. | Pools whose size is stable or predictable, and clusters where the team accepts automatic PG splits and merges. | Automatic changes land during peak load, and a pool with no growth hint can be sized for its current data and then starve as it fills. |
| target_size_ratio | Tells the autoscaler the share of total cluster capacity the pool is expected to use, so it sizes PGs for future data and not only current data. | New pools that will grow substantially, such as a large RBD image pool created before its data arrives. | The ratios across pools add up to more than the cluster can hold, which skews the calculation. Too high a ratio over-allocates PGs, and too low leaves the pool undersized. |
| bulk flag | Tells the autoscaler to start the pool with a high PG count and keep it there, instead of starting small and growing. | Large pools that will hold most of the data from day one, where early small PG counts would cause imbalance. | Applying bulk to small or short-lived pools spreads them across many PGs, consuming per-OSD PG budget and memory without benefit. |
| mon_target_pg_per_osd | Sets the number of PG replicas per OSD the autoscaler aims for, which caps how many PGs the cluster as a whole carries. | Clusters where the team needs a documented, consistent PG budget per OSD across all pools. | Raising the value to fit more pools increases per-OSD memory use and peering load, especially during recovery when OSDs are busy. |
| Checking the result with autoscale-status | Shows current PG counts, target counts, ratios and the autoscaler mode for each pool. | Every change, before and after, and during periodic reviews of PG balance. | Reading only the current PG count and missing the target or ratio column hides why the recommendation differs from what you expect. |
Configuring the autoscaler on a new cluster
This sequence takes a freshly bootstrapped Ceph cluster from its default state to a verified autoscaler configuration, with growth hints and bulk flags set per pool. The result is a cluster whose PG counts match the capacity plan before any production data is written.
Confirm the release and autoscaler state
The cluster administrator checks which Ceph release is running and confirms the PG autoscaler manager module is enabled. Use the cluster status and the module list from the admin shell to see the current state. Record the release, the default autoscale mode, and any pools that already exist. The step is done when the release matches the version you planned for and the autoscaler module appears as enabled.
Set the default autoscale mode
Decide whether new pools should use warn or on mode, then set that as the cluster default so every new pool inherits it. Warn mode only reports recommendations, while on mode lets Ceph change PG counts itself. Many teams start in warn mode on a new cluster so they can review each change first. The step is done when the configured default reads back correctly from the configuration and new test pools pick it up.
Set growth hints for each pool
For each pool that will hold a significant share of capacity over time, the storage owner sets a target size ratio that reflects the expected fraction of cluster capacity the pool will use. Pools with little planned data should keep the default. Ask the application owners for growth estimates in writing, since the ratios are only as good as those inputs. The step is done when every pool that needs a hint has one set and the hints sum to a value your plan supports.
Flag bulk pools
Mark the large data pools, such as RBD data or RGW data pools, with the bulk flag so the autoscaler starts them with a higher PG count instead of growing them slowly from a low value. Leave small metadata and index pools unflagged. Confirm the flag against the Ceph documentation for your release, because flag behavior is tied to specific versions. The step is done when the flagged pools are listed as bulk and the other pools are not.
Run autoscale-status and compare recommendations
Run the autoscale-status command and read the table for each pool, comparing the current PG count, the ideal PG count and the target ratio against your capacity plan. Check that the recommended values are plausible for the pool's expected size and that no pool is marked as oversized or undersized without a reason. If a recommendation conflicts with the plan, adjust the hint or flag and run the command again. The step is done when every recommendation matches a documented decision.
Apply the changes and review the monitor settings
Apply the agreed mode, hints and flags, and confirm the target PG per OSD setting, mon_target_pg_per_osd, is consistent with your OSD count and the release you run. Change the value only when your plan calls for it, and record the reason. Let the autoscaler act if you chose on mode, or apply the warned changes manually with the pool commands. The step is done when the configuration shows the agreed values and no pool is pending an unreviewed change.
Verify PG states are active and clean
Wait for any PG splitting or merging to finish, then check that all placement groups report active and clean in the cluster status. Investigate any PGs stuck in peering, degraded or undersized states before continuing. Do not load production data until the cluster is stable and the health output shows no PG warnings. The step is done when the status output shows all PGs active and clean and the health state is OK.
How the autoscaler setting changes by pool type
The pool that will hold most of the cluster's data benefits most from autoscaler hints, because its PG count should follow its share of raw capacity. Set the autoscaler to on for this pool so Ceph adjusts PG numbers as data arrives, and give it a size hint that reflects the share you expect it to use. Hints are relative, so the value only makes sense when you review all pools together.
- Mode:
onlets the autoscaler change PG counts without a manual step, which suits a pool that will fill over time. - Hint: Set
target_size_ratioto the pool's expected share of total capacity, and check that the shares across all pools add up to what you intend. - Bulk flag: Mark the pool as bulk if it will hold large amounts of data from the start, so it begins with a larger PG count before it fills.
- Per-OSD target: Review
mon_target_pg_per_osdwith your release's documentation, because it sets how many PGs the autoscaler aims to place on each OSD.
After setting hints, check that the recommended PG counts match the capacity plan you signed off on.
A small pool holds little data for its whole life, such as a control or metadata pool or a small index pool. A large PG count on such a pool adds per-OSD overhead without adding capacity or throughput. In most cases the autoscaler can manage these pools with minimal hints, and the main task is to confirm that the recommendation is not inflated.
- Mode:
onis usually suitable, since the autoscaler will keep the count low. Usewarnif you prefer to review every change yourself. - Hint: Leave
target_size_ratiounset unless you have a known share. An oversized hint reserves PGs the pool will never use. - Aggregate load: Many small pools together still draw on the PG budget of each OSD, so review the combined count across all pools rather than each pool alone.
- Verification: Read the recommendation in
ceph osd pool autoscale-statusand compare it with the expected object count and data size from the application owner.
Before accepting a recommendation for a small pool, confirm the expected growth with the team that owns the application, because a pool that is small today may not stay small.
A pool that starts small but is expected to grow substantially presents a timing problem. The autoscaler bases its recommendation on current usage, so early on it may choose a PG count that is too low for the data that will arrive later. Setting a size hint during design lets the count anticipate growth, and it also gives you a documented basis for the choice.
- Mode: Use
onwith a size hint, so the autoscaler plans for the expected future share of the cluster. - Hint: Set
target_size_ratioto the expected future share, not to today's usage. Record the forecast and the date it will be reviewed. - Ceiling: Make sure the hints you set do not claim more capacity than the cluster will provide, because the ratios are applied against total capacity.
- Verification: After each growth phase, compare actual usage with the forecast and adjust the hint when the two diverge.
Get a growth forecast in writing from the application owner and keep it with the cluster design record, so the hint has a traceable source when someone reviews it later.
Some organizations must keep PG counts fixed and change them only through an approved change process. Autoscaler changes move data and add recovery load, so an automatic change at an unplanned time can conflict with a change freeze or a maintenance window. In this situation the autoscaler is still useful as an advisor, but it should not act on its own.
- Mode: Use
warnto receive recommendations without automatic changes, oroffto disable the autoscaler for the pool entirely. - Manual changes: Plan PG increases as scheduled changes with a recorded rollback plan, since they move data and load the cluster.
- Review cadence: Schedule regular reviews of the autoscale recommendations so that advice is not ignored between change windows.
- Verification: Confirm the mode for each pool in the autoscale output and record the approved PG count in the change record.
Confirm with your change board how PG changes are approved, and name the person who watches recommendations between reviews so that the warning does not go unread.
Operational risks when PG counts change under load
Changing placement group counts on a live cluster moves data, competes with client traffic and can shift capacity in ways the dashboards do not show at first. The cards below cover the risks that tend to surface after a PG change, and the checks that catch them before a change window opens.
Data movement from splits and merges
Raising pg_num splits existing placement groups, and lowering it merges them. Both cause data to be rewritten across OSDs, so a single change can move a large share of a pool's data. Before changing a pool, estimate the data that will move from the pool's stored size, and schedule the change for a window where the cluster can absorb that work. Watch misplaced and degraded object counts until they return to zero.
Recovery traffic competing with client I/O
Backfill and recovery use the same OSDs, network links and drives that serve application reads and writes. Latency-sensitive workloads such as virtual machine disks often feel the change before any alarm fires. Confirm the recovery and backfill limits you intend to use, measure client latency during a test change in a non-production pool, and agree a rollback point with the application owners before you start.
Misleading recommendations from wrong hints
The autoscaler sizes pools from what it knows about them. A target_size_ratio set too low for a pool that will grow, or a bulk flag applied to a small pool, produces recommendations that look reasonable but hold the wrong number of PGs. Compare each recommendation with the pool's expected size and growth, and record which hint drove it so the reasoning can be reviewed later.
Unexpected changes in on mode
In on mode the autoscaler applies its own recommendations without waiting for an operator. A pool that gains data, or a hint change made by another administrator, can trigger a split or merge outside a planned window. Decide per pool whether warn or on is appropriate, check the mode before any maintenance, and alert on autoscaler-driven PG changes so they appear in operations review.
Uneven balance across failure domains
PG counts are set per pool, but data lands according to CRUSH placement across hosts, racks and rooms. If the OSD count or device class mix differs between failure domains, a PG change can leave some domains fuller than others, and the fullest domain sets your usable capacity. Check per-OSD PG counts and utilization by failure domain after each change, not only the cluster total.
Documenting decisions for audits and change records
A PG change without a written rationale is hard to defend after an incident or during an assessment. Record the pool, the before and after pg_num, the autoscaler mode, the hints in use, the expected data movement, the change window and the verification results. Keep the autoscale-status output with the change ticket so reviewers can see what the system recommended and what the team chose.
Questions teams ask before setting PG counts
How much effort does a placement group plan take?
The effort depends mainly on how many pools the cluster will hold, how many of them will grow, and how much the OSD count may change over the planning horizon. A single pool on a small, stable cluster is a short exercise. A cluster with block, file and object pools, each with its own growth rate, device class and replication or erasure coding profile, takes longer because every pool's PG count has to be checked against the others on the same OSDs. Effort also rises when the hardware list is still changing, since PG targets depend on how many OSDs will exist and on how their capacity is distributed.
Can our internal team set PG counts without a partner?
Yes, many platform teams do this themselves, provided someone on the team understands CRUSH rules, pool types and how the autoscaler makes its decisions. The work is mostly analysis and documentation: inventorying pools, writing down the expected growth of each one, and checking the autoscaler's recommendations before accepting them. Teams that find this difficult usually lack a second reviewer, not the technical knowledge. A partner review adds an outside check on the assumptions, which is most useful before the cluster takes production data, when a wrong target is cheap to correct.
What do we need to give a partner before a PG review?
Prepare three inputs. First, a pool inventory listing each planned pool, its purpose, its protection scheme, the device class it will use and the application that consumes it. Second, a growth forecast for each pool over the period you plan for, with the assumptions stated, such as expected tenant onboarding or dataset size. Third, a hardware list with the number of hosts, OSDs per host, drive sizes and media types, and the planned network layout. The Ceph hardware recommendations help confirm that the list matches how the cluster will be built. Missing forecasts are the most common reason a review stalls.
How long does a PG review take for a small or large cluster?
The duration follows the number of pools, the number of OSDs and how many decisions remain open. A small cluster with a few stable pools and a settled hardware list can be reviewed in a short working session. A larger cluster with many pools, several device classes and a multi-site plan needs more time for each pool's assumptions and for testing the resulting layout. The schedule also depends on how quickly your team can answer questions about forecasts. Ask any provider for a written timeline tied to the agreed scope, and confirm which inputs must be complete before the review begins.
What does a PG review cost and what drives the quote?
A PG review is usually one part of a larger cluster design or deployment engagement, so the cost depends on its scope within that work. The main drivers are the number of pools, the number of distinct device classes and CRUSH rules, whether the review includes checking the cluster after data is loaded, and how much forecasting work falls to the provider. Recurring costs are separate and appear only if you retain someone to review PG counts as the cluster grows. DeployOpen does not publish a price list. A quote follows from the written scope, so ask for the deliverables, assumptions and any follow-up reviews to be listed.
What changes after go-live when PG counts are set?
After go-live, PG counts change as data grows, OSDs are added or removed, and pools are created or retired. If the autoscaler is active, it can adjust PG counts on its own, which moves data between OSDs and creates recovery load while it does so. Operators need to schedule that activity around client traffic and watch for backfill during working hours. Growth forecasts also drift, so the target settings you chose at the start should be reviewed when a pool's real usage departs from its plan, when hardware is added, or when a new application starts using the cluster.
Should we run the PG autoscaler in warn or on mode?
Start in warn mode on a new cluster unless you have already reviewed the recommendations for every pool. In warn mode the autoscaler reports the PG count it would choose and raises a health warning, but it does not change anything, so your team can compare its suggestions with the pool plan. on mode lets the autoscaler apply changes automatically, which suits pools whose growth you understand well. Per-pool behavior is set with pg_autoscale_mode, and the current recommendations appear in the output of ceph osd pool autoscale-status. Confirm the mode you choose against the documentation for your Ceph release before you apply it to production pools.
Does a pool that will grow need target_size_ratio set?
Usually yes, if the pool will hold a large share of the cluster's data later and is empty or small at go-live. Without a hint, the autoscaler sizes a pool by its current usage, so a pool that will grow may start with too few PGs and then need large data movements as it fills. Setting target_size_ratio tells the autoscaler what fraction of the cluster the pool is expected to use. Set the ratio for every growing pool at the same time, so the values together describe the whole cluster, and record the reasoning so a later reviewer can see why each value was chosen.
How do we read autoscale-status recommendations correctly?
Treat the output of ceph osd pool autoscale-status as a suggestion built from the data present at that moment, not as a final answer. Check the current PG count, the suggested PG count, the target ratio and the pool's effective size before accepting a change. Compare the suggestion with your pool inventory, since an empty pool that will hold most of the cluster's data later will show a low suggestion now. Also check that the pools share the same device class and CRUSH rule, because pools on different media compete for different OSDs. Record each accepted change with its reason.
What a PG plan from DeployOpen includes
A scoped PG engagement starts with a pool inventory that lists every pool the cluster will carry at launch, with its application, replication or erasure coding profile, its CRUSH rule and device class, and the owner who will answer questions about its growth. The inventory is the foundation for everything else, because PG counts are a property of individual pools and of how many OSDs those pools share. We record each pool's current and expected data volume, the number of objects it is likely to hold, and whether the pool is expected to stay small, grow steadily or hold most of the cluster's data. The output is a written table that the platform team can review and change before any setting is applied, and it becomes the reference when a new pool is requested later.
The second deliverable is the autoscaler plan. For each pool we recommend an autoscaler mode, typically on, warn or off, and explain why. Where a pool will grow into most of the cluster, we propose a target_size_ratio that reflects its expected share of raw capacity, and where a large pool will hold data from its first day, we propose the bulk flag so the autoscaler starts it with a sensible PG count rather than growing it from a small number. We also document whether mon_target_pg_per_osd should keep its default or change, and why. Each setting is written next to the reason for it, so an operator who reads the plan in a year understands the intent.
The last deliverable is a verification record. It captures the output of ceph osd pool autoscale-status before and after changes, notes which recommendations were accepted or declined, and lists the checks that confirm PG states are healthy and that no pool is left with a count the team cannot explain. The record also sets out who reviews autoscaler recommendations after handover and what triggers a review, such as a large new pool or a change in OSD count. Pricing follows from the written scope, which states the pools, clusters and review points covered, the ownership of each deliverable, and the dates agreed before work starts. Ask for the scope to name which pools are in and which are excluded, and whether follow-up reviews are included or offered as a retainer.
How DeployOpen scopes and supports Ceph PG planning
DeployOpen plans, implements, documents and supports self-hosted open-source platforms inside your own infrastructure, including Ceph clusters. For placement group planning, we start from the pools you intend to run, how fast each will grow, and the cluster's OSD count, then set autoscaler modes and targets in writing before the cluster takes production data.
How we scope
- Inventory of planned pools, expected growth per pool and the OSD count per device class
- Written decision on autoscaler mode per pool, with reasons for any pool set to warn or off
- Agreed list of pools that need target_size_ratio or bulk settings, and why
- Fixed-scope terms, agreed in writing before any cluster changes begin
How we build
- Review of autoscale-status output on a test cluster before enabling changes on production pools
- Configuration of mon_target_pg_per_osd and pool targets as documented, with values recorded
- Check that CRUSH rules and failure domains match the PG counts chosen for each pool
- Tests of pool creation and growth against the agreed plan, run in your environment
How we hand over
- Runbook covering autoscaler modes, target ratios, and how to read recommendations
- Record of each pool's settings, the reasoning behind them, and the review date
- Walkthrough with your storage and platform team on when a recommendation needs review
- Documentation of rollback steps for autoscaler changes on live pools
How we support
- Ongoing support and periodic review of pool growth against PG targets is available as a retainer
- Review of PG settings after hardware additions, new pools or Ceph upgrades
- Coordination with your team on Ceph release planning using the published release schedule
- Support scope and response terms agreed in the retainer before work starts

