Capacity and concurrent jobs
Capacity is how many IaC jobs one agent executes at the same time. The Overview Utilization metric is the share of online runners that currently have at least one job.
How capacity works
Each runner can execute multiple IaC jobs in parallel, up to its maxConcurrentJobs limit. The scheduler assigns a new job to a runner only if activeJobs < maxConcurrentJobs.
Jobs in queue
All jobs run
in parallel
(up to limit)
Per-runner limit
| Constant | Value |
|---|---|
Minimum maxConcurrentJobs | 1 |
| Maximum | 100 |
The control plane scheduler and the agent both honor this value. Organization plans can impose a lower cap; the edit dialog helper text shows Organization limit: N when one exists.
Kubernetes agents often register with maxConcurrentJobs: 50 (AXIO_RUNNER_MAX_CONCURRENT_JOBS to override).
If inventory still shows “Running 1 job” at 1/1 after you expected more parallelism, the row may be on an older image or a stuck RUNNING workload. Cancel the run or restart the agent so heartbeats reconcile activeJobs.
When a runner is “full”
The scheduler treats a runner as busy when activeJobs >= maxConcurrentJobs. That agent will not receive another lease until a job completes.
Overview Running counts those busy online runners. Idle is online with zero active jobs.
Fleet size
| Scope | Description |
|---|---|
| Group maxRunners | Optional cap on self-hosted agents in that group. |
| Plan maxCustomerRunners | Org-wide cap on customer-hosted agents. |
| Hosted fleet | Tenant minutes/storage limits (maxProviderExecutionMinutes, maxProviderStorageBytes), not a visible runner count. |
Autoscaling (AUTO / SCHEDULED on the runner platform) mints tokens and launches infrastructure up to maxRunners on the internal pool. Manual Setup registration ignores that provisioner until you enable it.
See deployment and RUNNER_DEPLOYMENT
Lifecycle modes (internal pool)
| Mode | Behavior |
|---|---|
PERSISTENT | Stay registered until you remove or scale down. |
EPHEMERAL | Idle managed runners terminate on scale-down. |
DYNAMIC | One runner per queued job (up to maxRunners). |
Ephemeral assignment
| Scope | Behavior |
|---|---|
JOB (default) | One ephemeral runner per job. |
WORKFLOW | Same runner for all workloads that share workflowRunId. |
These are pool/policy settings, not Overview columns. Tenants usually run persistent self-hosted agents from Setup.
Utilization alerts
Utilization above 85% is highlighted on the overview chip. Add runners, raise maxConcurrentJobs (if the host can take it), or move work to hosted labels.
Utilization is above 85%. Consider adding runners, raising maxConcurrentJobs, or using hosted labels.