mediumIntermediateRED#queue#backlog#runners#concurrency#slow

Workflow queue backlog - too many jobs waiting for runners

Workflow runs show 'Queued' status for many minutes before starting

Likely source:performancescaling

Focused incident mode — strips away everything but this runbook.

Symptoms

  • Workflow runs show 'Queued' status for many minutes before starting
  • Total workflow duration is 20+ minutes but the actual job runs in 3 minutes
  • Multiple workflows pile up in the queue simultaneously

Free GitHub accounts have a 20-concurrent-job limit. If your org has 5 repos each running 5 jobs on every push, you will hit the limit immediately.

Evidence to grab

Collect these artifacts before you change anything — they prove (or rule out) each cause.

  • Queued runs count

    gh run list --repo <OWNER/REPO> --status queued --limit 20 --json name,createdAt
  • Concurrency limits

    cat .github/workflows/<file>.yml | grep -A5 'concurrency:'

Diagnostic flow

Run the steps in order, marking each claim confirmed or refuted. The evidence you gather feeds the ranked causes below.

Guided decision tree is ready.

Steps with commands, expected output, and pass/fail branches.

Ranked root causes

Evidence checklist

  • Free plan has 20 concurrent jobs; 25+ jobs are queued
  • Multiple repositories in the org are running CI simultaneously

Confirm before fixing

gh api /orgs/<OWNER>/settings/billing/actions --jq '.included_minutes'
READ

Check plan concurrency limit

Fix

echo 'Upgrade plan or add self-hosted runners at https://github.com/settings/billing'
READ

Increase concurrency by upgrading or adding self-hosted runners

Resolution runbook

Apply from top to bottom after the cause is confirmed. Review every command before running it — risk tags are shown on each.

1
gh run list --repo <OWNER/REPO> --status queued --limit 20 --json name,createdAt
READ

See what is queued

2
gh run cancel <RUN_ID>
DESTRUCTIVE

Cancel redundant queued runs to free slots

3
cat .github/workflows/<file>.yml | grep -A10 'strategy:'
READ

Review matrix size

Prevention

  • Use concurrency groups to cancel superseded runs on the same branch.
  • Reduce matrix dimensions for non-release workflows.
  • Use path filters to skip CI on docs-only changes.
  • Add self-hosted runners for high-volume CI workloads.

Commands marked READ CHANGE DESTRUCTIVE — never run DESTRUCTIVE commands against production data you cannot restore. Copy → verify → execute.