# Balancing

## Introduction

Balancing decides how a Capacity budget's origin concurrency limit is shared across
member pools. Configure it under **Capacity → {budget} → Balancing**.

**Fixed** pins each pool's share. **Auto** keeps each pool's reserve and moves
spare slots toward load under the origin concurrency limit.

## Fixed

Each attached pool receives a reserved concurrency allocation. Each pool admits
up to that many requests in flight. Quiet pools do not lend slots to
hot pools. Sum of reserved shares must stay at or below the origin concurrency limit.

Choose Fixed when you want predictable per-pool caps and do not need slots to
move with load.

## Auto

Auto is available on Business. Each pool keeps a **reserved** pin. The budget
also has **float**: slots left when the sum of reserved pins is below the
origin concurrency limit.

```
float = origin concurrency limit − sum(reserved)
```

When a hot pool needs more than its pin, Auto may grant a temporary lease from
unused float. Reserved slots stay local to their pool. Auto never admits more
across all members than the origin concurrency limit. If Auto cannot apply
shared balancing, pools fail closed to their local reserve.

When the sum of reserved pins equals the origin concurrency limit, float is
zero and no pool can climb above its pin.

### Per-pool Max

Optional **Max** on a member caps how high that pool may climb under Auto
(must be at least its reserved pin). Member maxes may sum above the concurrency limit;
pools still compete for float under load, and the budget hard-caps the origin.

### Advanced tunables

| Setting       | Meaning                                                  | Default |
| ------------- | -------------------------------------------------------- | ------- |
| Max shift     | Most float slots one pool may borrow per window          | 1       |
| Cooldown (ms) | Minimum time between float grant windows (at least 1000) | 3000    |

Tighter cooldowns grant float faster but can thrash under noisy load. Prefer the
defaults until you have a measured need.

## Switching strategies

- **Fixed → Auto:** members keep their reserved pins. Float becomes
  concurrency limit minus sum reserved. Borrowing can begin under load.
- **Auto → Fixed:** borrowed slots drain; each pool's static max concurrency
  returns to its reserved pin.

## Live columns

Under Auto, the member table shows active, reserved, effective limit, borrowed,
lending, and queue depth. New grants borrow float only, so Lending normally
stays at zero. It can be nonzero briefly while a temporary loan finishes
draining. The header shows origin concurrency limit, sum reserved, float free,
and sum active.

## Plan gate

| Feature                         | Plans                 |
| ------------------------------- | --------------------- |
| Origin capacity budgets (Fixed) | Team, Business, trial |
| Auto balancing                  | Business              |

Borrowed admits meter like normal admits. There is no separate borrow meter.

## Next steps

- [Capacity](/docs/capacity)
- [Why a pool borrowed slots](/docs/knowledge-base/capacity-borrow)
- [Concurrency](/docs/pools/concurrency)
