Autoscale min RU/s floor driven by historical peak — why is there no bound/reset on the historical peak

Augustine Wu 0 Reputation points Microsoft Employee
2026-07-24T23:18:22.9266667+00:00

An attempt to lower a container's autoscale max throughput to 35,000 RU/s was rejected with:

The offer should have valid throughput values between 39000 and 100000 inclusive in increments of 1000. Requested throughput 35000 is less than minimum throughput 39000 required to fulfil the consumed storage of ~152 GB.

Analysis

Cosmos DB enforces the autoscale minimum max RU/s as:

 MAX(1000, storage_GB × 10, highest_RUs_ever_provisioned ÷ 10) 

For this container the 39,000 floor is not explained by current usage:

• Storage: ~152 GB → only ~1,525 RU/s

• Physical partitions: 8 → only ~8,000 RU/s

• Historical peak: the binding factor — the container was previously provisioned to ~390,000 RU/s, and 390,000 ÷ 10 = 39,000.

Cosmos permanently retains this "highest RU/s ever provisioned" high-water mark, so the floor stays at 39,000 even though current storage and partition count are far lower. The error text references "consumed storage" only because that's the generic offer-validation message; the actual driver is the historical scale-up.

Question for the team

Why is there no bound, decay, or reset on this historical high-water mark? If a container's storage and partition count have dropped well below what the peak required, why does the peak continue to dictate the minimum indefinitely — with no way to recompute the floor against current storage/partitions, and no mechanism to reset it short of migrating the data into a brand-new container?

Azure Cosmos DB
Azure Cosmos DB

An Azure NoSQL database service for app development.


2 answers

Sort by: Most helpful
  1. Pilladi Padma Sai Manisha 11,705 Reputation points Microsoft External Staff Moderator
    2026-07-25T23:45:12.8133333+00:00

    Hi @Augustine Wu
    The highest RU/s ever provisioned ÷ 10 term isn't really about throughput history; it's a proxy for physical partition count, and that's the piece that can't be silently rolled back.

    When the container was pushed to ~390,000 RU/s, Cosmos split it across ~39 physical partitions (each partition serves up to 10,000 RU/s). Partition splits are one-way by default Cosmos won't auto-merge or relocate data on its own, because doing so transparently would risk latency, availability, and hot-partition regressions. So the high-water mark persists to represent "this container is laid out across N partitions," and the floor stays at 39,000 until that physical layout actually changes. That's why there's no time-based decay or in-place reset: storage/partition counts dropping doesn't collapse the underlying partition set by itself.

    To actually lower the floor you have two supported paths:

    1. Partition Merge (preview) reduces physical partition count so the minimum recomputes downward. Check preview eligibility for your account's API/throughput type, enable it, run the merge, then retry the scale-down.
    2. Rebuild create a new container provisioned low from the start and migrate the data (Data Migration tool / Live Data Migrator / Spark). No peak history → low floor.

    If neither is worth it, remember autoscale bills per-hour on the actual max between 0.1×Tmax and Tmax, so an idle container at a 39,000 max costs ~3,900 RU/s-equivalent, not the full 39,000.

    Was this answer helpful?

    0 comments No comments

  2. Ravi Kiran Pagidi 170 Reputation points
    2026-07-25T03:36:26.0766667+00:00

    Hi Augustine,

    Your understanding is correct. For an autoscale container, the minimum maximum RU/s that you can lower to is based on:

    MAX(1000, highest maximum RU/s ever provisioned / 10, current storage in GB × 10)
    

    rounded to the nearest 1000 RU/s.

    So if the container was previously scaled to about 390,000 RU/s, the current floor of 39,000 RU/s is expected, even if the current storage is much lower.

    I do not think the error message is giving the full reason. It mentions consumed storage, but based on the formula, the effective blocker in your case appears to be the historical maximum RU/s value.

    As far as I know, there is no public self-service option to reset or decay that historical high-water mark on an existing container. If you need to get below that floor, the practical options are:

    1. Open a Microsoft support case and ask if any backend remediation is possible for this specific container.
    2. Migrate the data to a new container with the desired lower autoscale max RU/s.
    3. Review whether partition merge helps your physical partition layout, but I would not assume it resets the historical RU/s floor unless Microsoft Support confirms that.

    The “why no decay/reset” part is probably a product design question for the Cosmos DB engineering team. The current public documentation describes the formula but does not document a user-controlled reset mechanism for the historical peak.

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.