Controller Sizing & Capacity Planning in Jenkins: Keeping the Brain of Your Pipeline Fleet Healthy

Controller Sizing & Capacity Planning in Jenkins: Keeping the Brain of Your Pipeline Fleet Healthy

A deep, beginner-friendly guide to how the Jenkins controller consumes resources, how to size it correctly, and how to plan its capacity as an organization's pipeline usage keeps growing.

Imagine an air traffic control tower at a small regional airport. When the airport only handles a handful of flights a day, a single controller with basic equipment manages everything comfortably. But as that airport grows into a major international hub with hundreds of flights, the exact same single controller and the exact same basic equipment would be catastrophically overwhelmed — not because air traffic control itself stopped working, but because nobody planned for the tower’s own capacity to grow alongside the airport it serves. The Jenkins controller faces exactly this challenge. It’s the coordinating brain behind every pipeline, and while individual build agents can be added freely to handle more work, the controller itself has real, finite limits that must be deliberately planned for as an organization’s usage grows. This tutorial explains what actually consumes a controller’s resources, how to size it correctly, and how to plan its capacity over time — starting from zero prior knowledge.

1What Is Controller Sizing and Capacity Planning?

Before diving into specifics, it’s worth being precise about which machine this whole topic is actually about.

The controller as the coordinating brain

As covered elsewhere in the broader world of Jenkins, the controller is the central machine that schedules jobs, tracks build history, serves the web interface, and coordinates every agent in the fleet — while the actual heavy lifting of compiling and testing code happens out on separate agent machines. Controller sizing is specifically about ensuring this one central, coordinating machine has enough memory, processing power, and storage to keep doing its job smoothly as demand on it grows.

Simple Analogy

Think of a restaurant’s head chef, who doesn’t cook every dish personally but coordinates every station, tracks every order, and keeps the whole kitchen running smoothly. If the restaurant grows from serving thirty tables a night to three hundred, hiring more line cooks alone won’t help if that same single head chef is still trying to personally track every single order using the same notepad they used on day one.

Why this is a distinct concern from agent capacity

It’s tempting to assume that adding more build agents automatically solves any capacity problem, but the controller itself bears a real, separate load — tracking every queued and running build, holding build history in memory, rendering the web dashboard for every user, and coordinating communication with every single connected agent. This load grows with the number of jobs, builds, and agents in the fleet, regardless of how much raw compute power the agents themselves have.

Controller Load Source

Job and Build Count

More configured jobs and more historical builds mean more data the controller tracks and serves.

Controller Load Source

Concurrent Builds

Every simultaneously running build requires active coordination from the controller.

Controller Load Source

Connected Agents

Each connected agent maintains an ongoing communication channel the controller must manage.

Controller Load Source

User Interface Traffic

Every person viewing dashboards, logs, or build history adds load to the same central machine.

2Why Controller Sizing Matters

Neglecting this specific concern leads to a very particular, very disruptive kind of failure.

The problem of a single point of coordination becoming a bottleneck

Because every single pipeline in an organization depends on the same one controller to schedule and coordinate its work, an under-resourced controller doesn’t just slow down one team’s builds — it can slow down or even destabilize the entire organization’s ability to build and deploy software at once, since everyone shares that same central dependency.

!
Common Mistake

Assuming that adding more agent machines will fix general Jenkins slowness — if the controller itself is the actual bottleneck, more agents can make things worse, by giving the already-overloaded controller even more machines to coordinate.

The unique risk of a shared, unscaled dependency

Unlike an individual agent, which can simply be replaced or scaled out if it’s overwhelmed, a Jenkins controller traditionally runs as a single instance — meaning its capacity is a hard ceiling on the entire installation’s usable throughput until it’s deliberately resized, migrated to more capable hardware, or restructured into a different architecture entirely.

1
Controller coordinating the entire fleet
All
Teams affected if it becomes overloaded
Proactive
Planning needed before it becomes a crisis

Capacity planning as a way to stay ahead of growth

Because organizations rarely stay the same size, deliberately planning controller capacity ahead of anticipated growth — rather than reacting only after performance visibly degrades — keeps the controller from ever becoming the invisible ceiling silently limiting how fast an entire engineering organization can actually deliver software.

Staying Ahead of Organizational Growth

A company doubling its engineering headcount over eighteen months proactively upgrades its Jenkins controller’s memory and storage well before usage actually doubles, avoiding the disruptive scramble of an emergency resize under active production pressure.

3The Anatomy of Controller Resource Consumption

Understanding exactly what consumes each type of resource is the foundation for sizing a controller correctly.

Memory: the controller’s working attention span

The controller keeps a great deal of active state in memory — details about every currently queued and running build, cached information about job configurations, and data supporting the web dashboards being actively viewed. As the number of jobs, concurrent builds, and active users grows, memory demand grows right alongside it.

ResourcePrimary DriverEveryday Comparison
Memory (RAM)Job count, concurrent builds, active dashboard usersHow much a person can actively hold in their working memory at once
CPUScheduling decisions, plugin processing, rendering pagesHow fast that person can actually think and respond
Disk storageBuild logs, archived artifacts, job configuration historyA filing cabinet accumulating paperwork over years
Disk I/O speedHow quickly build logs and configuration can be read and writtenHow quickly that filing cabinet’s drawers open and close

CPU: the controller’s processing speed

Processing power is consumed by the constant background work of evaluating which jobs are ready to run, rendering web pages for every visitor, and running the logic contributed by every installed plugin — a controller with many active plugins and a busy scheduling workload needs meaningfully more processing capacity than a lightly used instance with only a handful of jobs.

Simple Analogy

Memory is like how many separate conversations a receptionist can keep track of simultaneously without losing their place, while processing power is like how quickly that receptionist can actually respond to each one — both matter, and being short on either one causes a different, recognizable kind of slowdown.

Disk storage: the controller’s growing memory of the past

Unlike memory and processing power, which reflect current, active load, disk storage accumulates over time — every build’s console log, every archived artifact, and every job’s configuration history adds up, meaning storage needs tend to grow steadily even if the controller’s day-to-day active workload stays perfectly flat.

Resource

Memory

Reflects current active load — jobs, concurrent builds, and dashboard users.

Resource

CPU

Reflects how quickly the controller can process scheduling and rendering work.

Resource

Disk

Accumulates steadily over time from logs, artifacts, and configuration history.

4How Jenkins Uses Controller Resources Internally

Understanding the internal mechanics behind resource consumption clarifies why certain usage patterns hit the controller harder than others.

The scheduling loop and its constant background cost

At the heart of the controller’s ongoing work is a continuous scheduling loop, constantly evaluating which queued jobs can now be matched to an available agent, as described in the earlier discussion of node labels — this loop runs continuously in the background, and its cost scales with how many jobs are simultaneously queued and how many agents exist to evaluate against.

sequenceDiagram
    participant Q as Build Queue
    participant C as Controller
    participant Mem as In-Memory State
    participant A as Agents
    Q->>C: New job queued
    C->>Mem: Track job state in memory
    C->>C: Evaluate scheduling against all agents
    C->>A: Assign job when a match is found
    A-->>C: Report build progress and completion
    C->>Mem: Update job state, eventually persist to disk
        
FIG 1 — The controller’s continuous internal loop of tracking, scheduling, and updating build state

Plugin overhead as a hidden, cumulative cost

Every installed plugin can add its own background processing, its own memory usage, and its own contribution to page rendering time — a controller with dozens of active, feature-rich plugins genuinely needs more headroom than an otherwise identical controller running a lean, minimal plugin set, even with the exact same number of jobs.

i
Helpful Note

When troubleshooting unexplained controller slowness, reviewing which plugins are installed and how heavily they’re actually used is often just as important as looking at raw job or build counts.

How build history and logs accumulate in memory and on disk

Every completed build’s metadata and console log needs to be written to disk, and depending on configuration, a meaningful amount of recent build data may also be cached in memory to make the dashboard feel responsive — a job history that’s never trimmed can quietly grow this footprint over months and years, adding real, ongoing memory and disk pressure that’s easy to overlook.

5Data Flow and the Load Lifecycle

Following a single build’s journey through the controller’s own resources shows exactly where load actually accumulates.

1

A build is triggered and queued

The controller adds the new job to its in-memory queue, consuming a small amount of memory immediately.

2

The scheduling loop evaluates it

CPU cycles are spent matching the job against available agents until a suitable one is found.

3

The build runs, streaming updates back

The controller receives ongoing progress and console output from the agent, holding recent output in memory.

4

The build completes and is persisted

Final build metadata and the full console log are written to disk for long-term storage.

5

The build’s history remains, accumulating over time

The completed build’s data stays on disk, and potentially partly in memory, contributing to the controller’s growing long-term footprint.

What flows through the controller versus what stays on the agent

The bulk of a build’s own heavy processing — compiling code, running tests — happens entirely on the agent, and only a comparatively small stream of status updates and console output flows back to the controller. However, at very high concurrency, even this comparatively modest per-build load adds up to something genuinely significant for the one central machine handling every build at once.

Simple Analogy

This is similar to a manager who doesn’t personally do every employee’s work, but still needs to receive and process a steady stream of status updates from every single person on the team — individually, each update is small, but a manager overseeing a thousand people feels a very different load than one overseeing ten.

6Types of Load and Where They Come From

Different sources of load stress a controller in genuinely different ways, and recognizing which is dominant matters for sizing correctly.

Job Configuration Load

Simply having a very large number of configured jobs, even mostly idle ones, adds baseline memory and disk overhead just from Jenkins tracking their existence and configuration history.

Build Concurrency Load

A high number of simultaneously running builds places direct, active demand on the scheduling loop and on the controller’s ability to process incoming status updates from many agents at once.

User Interface Load

A large number of people actively browsing dashboards, viewing live console logs, or triggering manual builds through the web interface adds a very different kind of load, centered on rendering pages and serving requests quickly.

Plugin and Integration Load

Plugins that poll external systems, process webhooks, or perform their own background work contribute load that scales with how many such integrations are active, independent of the raw job or build count.

Diagnosing which type of load is actually dominant

Because these load types stress different resources in different ways, correctly diagnosing which one is dominant in a given organization — a job-count-heavy instance versus a concurrency-heavy one versus a UI-traffic-heavy one — is essential before deciding whether the right fix is more memory, more processing power, or a different architectural approach entirely.

Load TypePrimary Resource StressedTypical Symptom When Overloaded
Job configuration countMemory and diskSlow overall dashboard loading
Build concurrencyCPU and memoryDelayed job scheduling, slow queue processing
User interface trafficCPU and networkSlow page loads for users specifically
Plugin and integration activityVaries widely by pluginIntermittent, hard-to-trace slowdowns

7A Methodology for Capacity Planning

Rather than guessing, a structured approach to sizing produces far more reliable, defensible results.

Step one: establish a genuine current baseline

Before planning for future growth, it’s essential to understand the controller’s current actual resource usage under real, everyday load — not its theoretical maximum capability, but what it genuinely consumes during a typical busy day, providing the honest starting point every further projection builds from.

1

Measure current baseline usage

Record actual memory, CPU, and disk consumption during a representative period of normal, everyday activity.

2

Identify the dominant load driver

Determine whether job count, concurrency, UI traffic, or plugin activity is the primary contributor, as discussed in Chapter 6.

3

Project future growth

Estimate how that dominant driver is expected to grow, based on planned headcount, team growth, or business goals.

4

Add deliberate headroom

Size for meaningfully more than the bare projected minimum, leaving room for unexpected spikes and future surprises.

5

Schedule a review checkpoint

Set a specific future date to revisit these projections against actual, observed usage, rather than assuming the plan stays valid indefinitely.

Why headroom matters more for a controller than for an ordinary agent

Because there’s only ever one controller coordinating the entire fleet, running it consistently near its resource limits leaves no margin at all for an unexpected spike — a single unusually busy release day, an unplanned surge in headcount — whereas an individual overloaded agent can simply be supplemented by adding another one alongside it.

!
Common Mistake

Sizing a controller to exactly match today’s average usage, with no meaningful headroom, leaves it perpetually vulnerable to being knocked over by any period of unusually high activity.

8Advantages and Trade-offs of Different Sizing Strategies

Different approaches to sizing a controller each carry their own genuine advantages and costs.

Advantages of Generous, Proactive Sizing

  • Provides ample headroom, reducing the risk of controller-related slowdowns
  • Avoids disruptive emergency resizing under active production pressure
  • Supports organizational growth without frequent, repeated capacity crises
  • Gives engineers a consistently responsive experience, supporting productivity

Disadvantages of Generous, Proactive Sizing

  • Costs more upfront than sizing tightly to current, measured needs
  • Risks over-provisioning if growth projections turn out to be too aggressive
  • Can mask underlying inefficiencies, such as excessive plugins or unbounded build history, that would otherwise be forced into the open

The cost of under-sizing versus the cost of over-sizing

While over-sizing wastes some infrastructure budget, under-sizing a shared, single-instance controller risks a genuinely organization-wide productivity slowdown affecting every team simultaneously — for most organizations, this asymmetry means erring somewhat toward generous sizing is the more defensible default, provided it’s paired with genuine, ongoing monitoring rather than treated as a substitute for it.

!
Trade-off to Remember

Generous sizing buys safety margin, but it should never replace actually understanding and monitoring what’s consuming the controller’s resources — a bigger machine simply postpones, rather than solves, an underlying inefficiency left unaddressed.

9Security Considerations

Because the controller holds so much sensitive material, its capacity and availability also carry real security weight.

Availability as a security property, not just a performance one

An overloaded, unresponsive controller isn’t just inconvenient — it can prevent legitimate security processes, such as an urgent patch deployment or a critical incident-response pipeline, from running when they’re needed most, which is precisely why availability itself is sometimes treated as a genuine security concern, not merely an operational one.

Simple Analogy

This is similar to a hospital’s emergency response system being so overloaded with routine, low-priority requests that it can’t respond quickly to an actual emergency — the system technically still works, but its practical unavailability under load becomes a genuine safety problem.

Protecting the controller’s disk from sensitive data sprawl

Because build logs and archived artifacts accumulate on the controller’s disk over time, and because these can sometimes inadvertently contain sensitive information if not carefully managed, capacity planning intersects directly with data governance — retention policies that regularly prune old, unnecessary build data serve both a storage-capacity purpose and a security purpose at once.

ANTI-PATTERN-01 Avoid
Problem

Build logs and artifacts are retained indefinitely, with no defined retention or cleanup policy, regardless of their age or continued relevance.

Why It’s Harmful

Disk usage grows unbounded over time, eventually threatening controller stability, while old logs potentially containing sensitive details accumulate indefinitely, well beyond any genuine operational need.

Correct Approach

Define and enforce a sensible retention policy for build history and artifacts, balancing genuine operational and audit needs against the risks and costs of unbounded accumulation.

Restricting who can change controller-level resource settings

Because certain controller-level settings — such as the number of executors running directly on the controller itself, a practice generally discouraged for security reasons — can affect both performance and security posture, changes to these settings deserve the same restricted access discussed for system configuration elsewhere in this guide.

10Monitoring, Logging, and Metrics

Given how consequential controller health is for an entire organization, genuine ongoing monitoring is essential, not optional.

The core metrics worth watching continuously

A small set of well-chosen metrics gives an administrator early warning of a developing capacity problem long before it becomes a visible, organization-wide slowdown, provided they’re actually watched regularly rather than checked only after complaints start arriving.

Metric

Memory Usage Trend

Whether memory consumption is climbing steadily over time, potentially heading toward a hard limit.

Metric

Scheduling Queue Depth

How many jobs are waiting to be scheduled, and for how long, as a signal of controller-side bottlenecking.

Metric

Disk Usage and Growth Rate

How quickly available disk space is being consumed, projecting forward to when it might run out.

Metric

Page Response Times

How quickly the web dashboard responds to real users, a direct measure of the experience people actually feel.

graph TD
    A[Controller Metrics Collected] --> B[Memory Trend]
    A --> C[Queue Depth]
    A --> D[Disk Growth Rate]
    A --> E[Page Response Time]
    B --> F[Capacity Dashboard]
    C --> F
    D --> F
    E --> F
    F --> G[Team Plans Proactive Resize]
        
FIG 2 — Turning ongoing controller metrics into a proactive capacity-planning input

Alerting on trend, not just threshold

Beyond a simple fixed alert threshold, watching the trend line of memory and disk usage over weeks and months often provides earlier, more actionable warning than waiting for a single hard limit to be crossed — a steadily climbing trend gives an organization time to plan a deliberate resize, rather than reacting to a sudden crisis.

11Design Patterns and Anti-Patterns

A handful of recurring design choices separate a well-managed controller from one perpetually on the edge of trouble.

Pattern: keep the controller lean, push work to agents

A well-managed setup deliberately minimizes work performed directly on the controller itself — running zero or minimal build executors there, and keeping installed plugins to genuinely necessary ones — reserving the controller’s own resources almost entirely for its core coordinating role.

Good Pattern: Zero Executors on the Controller

An organization configures its controller to run no build executors of its own at all, ensuring every single build runs on a dedicated agent, keeping the controller’s resources free for scheduling and coordination alone.

Anti-pattern: treating the controller as just another build machine

Running actual build workloads directly on the controller, in addition to its coordinating duties, both wastes its scarce resources on work that could run elsewhere and, more seriously, exposes the controller itself to whatever risks that build workload carries — a genuinely risky mixing of two very different roles.

ANTI-PATTERN-02 Avoid
Problem

The controller is configured with a meaningful number of its own build executors, running actual application builds directly on the same machine that coordinates the entire fleet.

Why It’s Harmful

Build workloads compete directly with the controller’s own coordinating work for the same limited resources, and any instability or security issue in a build can directly threaten the controller itself.

Correct Approach

Reserve the controller purely for coordination, running all actual builds on separate, dedicated agent machines instead.

Pattern: proactive retention and cleanup policies

As discussed in Chapter 9, defining and enforcing a sensible retention policy for build history and artifacts keeps disk usage growth predictable and bounded, rather than allowing it to accumulate indefinitely until it becomes an urgent, disruptive problem.

12Best Practices and Common Mistakes

These are the lessons most administrators learn only after their controller has already caused a genuinely disruptive slowdown.

Best Practice

Establish a Real Usage Baseline

Measure actual current consumption before making any sizing decisions.

Best Practice

Plan Headroom, Not Just Averages

Size meaningfully above projected needs, given the controller’s single-instance nature.

Best Practice

Keep the Controller Lean

Minimize plugins and never run actual build work directly on the controller itself.

Best Practice

Review Capacity on a Schedule

Revisit sizing decisions periodically, tied to organizational growth milestones.

Common mistake: sizing once and never revisiting it

A controller sized correctly for an organization of a hundred engineers can become badly undersized once that organization grows to five hundred, and treating the initial sizing decision as permanent, rather than something to periodically revisit, is one of the most common paths to an eventual, disruptive capacity crisis.

i
Helpful Note

Tying a controller capacity review to a recurring organizational rhythm — an annual planning cycle, a major headcount milestone — makes it far more likely the review actually happens, rather than being perpetually postponed.

Common mistake: ignoring plugin sprawl as a capacity factor

It’s easy to focus purely on job and build counts when planning capacity, while overlooking how a gradually growing collection of installed plugins, each adding its own overhead, can meaningfully shift a controller’s genuine resource needs over time even if job volume itself has stayed roughly flat.

13Scaling Beyond a Single Controller

At a certain scale, sizing a single controller more generously stops being enough, and a different architectural approach becomes necessary.

Recognizing when vertical sizing has reached its limit

Simply giving a single controller more memory and processing power, a practice sometimes called vertical scaling, works well up to a point, but very large organizations eventually reach practical or cost-effective limits on how large a single machine can reasonably be made, signaling that a different approach is needed.

Simple Analogy

This is similar to a single air traffic control tower eventually being unable to handle a truly massive volume of air traffic no matter how much additional staff and equipment are added to it — at some point, the entire region needs multiple, separately coordinated towers instead of one increasingly overloaded one.

Splitting into multiple, separately managed controllers

A common approach beyond a single controller’s practical limits is dividing the organization’s pipelines across multiple, independently managed Jenkins controllers — for example, one per major business unit or region — trading some centralized simplicity for genuinely independent capacity that scales separately for each part of the organization.

ApproachWhat It SolvesWhat It Costs
Vertical sizing (bigger controller)Moderate growth within one instanceEventually hits practical hardware limits
Multiple independent controllersVery large, organization-wide scaleLoses a single, unified view across all pipelines
Shared configuration as code across controllersConsistency despite multiple controllersAdded coordination overhead to keep them aligned

Maintaining consistency across multiple controllers

When an organization does split into multiple controllers, applying the same configuration-as-code principles discussed elsewhere in this guide across all of them helps preserve a consistent security posture and consistent tooling, even though the pipelines themselves are no longer coordinated by one single, central instance.

14Real-World and Industry Examples

Seeing how different kinds of organizations approach controller sizing makes the concept concrete.

A Mid-Sized Growing Company

A platform team establishes a quarterly review of controller memory and disk trends, proactively resizing the controller’s virtual machine well ahead of projected engineering headcount growth, avoiding any disruptive emergency resize.

A Large Enterprise with Many Business Units

Having outgrown what a single controller could reasonably handle, the organization splits into several independently sized controllers, one per major business unit, each scaled according to that unit’s own specific usage patterns.

A Security-Conscious Regulated Organization

A strict build log and artifact retention policy is enforced specifically to keep disk usage predictable and bounded, serving both a capacity-planning purpose and a data-governance requirement at the same time.

A Small, Efficient Startup

A lean plugin set and zero executors on the controller itself keep resource needs modest even as the company grows moderately, delaying the need for any significant controller resizing far longer than a less disciplined setup would.

A common thread across all four examples

In every case, the organization treats controller capacity as something requiring deliberate, ongoing attention rather than a one-time setup decision, recognizing that the controller’s health directly determines how smoothly every single team’s pipelines actually run.

“A controller that’s never been resized isn’t necessarily healthy — it might simply be one busy release day away from finding out it wasn’t.”

15Frequently Asked Questions

Straightforward answers to the questions almost every newcomer to controller sizing asks.

Q1If my builds are slow, does that always mean my agents need more resources?

Not necessarily — as explained in Chapter 2, general Jenkins slowness can just as easily stem from an overloaded controller, and adding more agents in that case can actually make things worse by giving the controller even more machines to coordinate.

Q2Does having a lot of configured jobs matter even if most of them rarely run?

Yes — as discussed in Chapter 6, simply having a very large number of configured jobs adds baseline memory and disk overhead from Jenkins tracking their configuration and history, independent of how often they actually run.

Q3Is it safe to run builds directly on the controller if I’m short on agents?

This is a recognized anti-pattern, discussed in Chapter 11 — running builds directly on the controller competes with its coordinating work and exposes it to unnecessary risk; adding a dedicated agent is the recommended approach instead.

Q4How much headroom should I plan for when sizing a controller?

There’s no single universal number, but as covered in Chapter 7 and Chapter 8, sizing meaningfully above projected minimum needs is generally worth the modest extra cost, given how disruptive an under-provisioned, single-instance controller can be.

Q5At what point should an organization consider running multiple Jenkins controllers instead of one large one?

As discussed in Chapter 13, this typically becomes worth considering once vertical sizing of a single controller reaches practical or cost-effective hardware limits, often at a very large organizational scale.

Q6Can too many installed plugins actually affect controller performance?

Yes — as explained in Chapter 4 and Chapter 12, each installed plugin can add its own memory usage and processing overhead, meaning a controller with many active plugins genuinely needs more resource headroom than a lean, minimal setup.

16Summary and Key Takeaways

Controller sizing and capacity planning addresses a concern that’s easy to overlook precisely because it’s separate from the more visible world of build agents: the single, central machine coordinating an entire organization’s pipelines has its own real, finite limits on memory, processing power, and disk storage, driven by job counts, build concurrency, user traffic, and plugin overhead. Because every team depends on this same shared controller, an under-resourced instance doesn’t cause an isolated problem — it becomes an organization-wide bottleneck. Sizing it well requires establishing a genuine usage baseline, projecting future growth deliberately, building in real headroom, and reviewing that plan on an ongoing basis rather than treating it as a decision made once and forgotten. For organizations that eventually outgrow what a single, generously sized controller can reasonably provide, splitting into multiple independently managed controllers becomes the next natural step. Handled with this kind of ongoing discipline, the controller remains the quiet, dependable coordinating brain behind an entire organization’s delivery — rather than becoming the invisible ceiling silently limiting how fast that organization can actually move.

Key Takeaways

  • The controller has its own distinct resource needs — separate from agent capacity, driven by job counts, concurrency, user traffic, and plugin overhead.
  • It’s a shared, single point of coordination — an under-resourced controller can bottleneck every team’s pipelines at once, not just one team’s.
  • Different load types stress different resources — correctly diagnosing the dominant driver matters before deciding how to fix a capacity problem.
  • A structured methodology beats guesswork — baseline measurement, growth projection, and deliberate headroom produce far more reliable sizing decisions.
  • Keeping the controller lean pays off — minimizing plugins and never running builds directly on it preserves its scarce resources for coordination alone.
  • Retention policy is both a capacity and a security concern — bounding disk growth also limits how long potentially sensitive build data lingers.
  • Sizing decisions need periodic revisiting — what’s correctly sized today can become badly undersized as an organization continues to grow.