Mike B
07/31/2026, 4:02 PMMarvin
07/31/2026, 4:02 PMMarvin
07/31/2026, 4:03 PMMarvin
07/31/2026, 4:03 PM/var/lib/docker growth and ensure log rotation / cleanup.
7) Network requirements matter more than people expect
Your workers need reliable outbound access to:
- Prefect Cloud
- your Git provider
- container registries
- destination data systems
In many environments, proxy/firewall/TLS constraints are a bigger deployment issue than CPU/RAM.
If you need an answer for your infrastructure team, I’d phrase it like this
“Because we are moving to Prefect Cloud, there is no longer a need to host Prefect’s API, UI, or database on-prem. The on-prem requirement is only for worker/execution infrastructure. Prefect does not appear to publish fixed hardware sizing guidance for Cloud workers, because sizing depends on the resource profile and concurrency of our flow runs. Prefect workers are lightweight; the main sizing driver is the Docker containers they launch. Linux (Ubuntu) is the preferred platform, and standard VM platforms are acceptable so long as they support Docker, Python, persistent storage, and outbound HTTPS connectivity.”
Suggested baseline recommendation for your use case
Based on what you described, I’d probably propose as an initial target:
- OS: Ubuntu LTS
- Platform: standard VM or physical server
- CPU: 8 vCPU to start
- Memory: 32 GB RAM
- Disk: 200 GB SSD minimum
- Docker: local engine with cleanup/log rotation
- Scaling approach: add another worker host rather than vertically scaling first
And if HA/reliability matters:
- 2 smaller Linux VMs instead of 1 large server
- each running a worker
- same or separate work pools depending on isolation needs
That said, if your flows are very lightweight, you could likely run smaller. If they are bursty with high concurrency, you may need more.
About best-practices docs
I did not find an official Prefect doc that serves as a complete “system requirements / hardware recommendations” guide for all deployment types.
The most relevant official docs are the worker/work-pool/deployment docs:
- Workers
- Work pools
- Deploy flows with Prefect
- Prefect Cloud
If you want, I can also help you turn your current workload into a more concrete sizing recommendation for IT — e.g. “given X concurrent runs, Y average container memory, Z image sizes, recommend N worker hosts with these specs.”Mike B
07/31/2026, 4:19 PMMarvin
07/31/2026, 4:19 PMMarvin
07/31/2026, 4:19 PMconcurrency ≈ runs_per_day × avg_runtime_hours / 24
That gives average concurrency. For sizing, you care more about peak concurrency, so use schedule overlap and actual observed peaks.
Example:
- 240 runs/day
- avg runtime 20 min = 0.333 hr
Average concurrency:
240 × 0.333 / 24 = 3.33
But if many runs happen in the same 2–3 hour window, peak concurrency could easily be 8–15 instead of 3.
---
What to collect from the Ubuntu server
If your flows run in Docker containers on that host, these are the most useful Linux-level checks.
1) CPU / memory / load over time
Install a lightweight monitoring stack if you don’t already have one:
- sysstat (sar)
- atop
- htop
- optional: Prometheus + node_exporter + cAdvisor if you want nicer history
Useful commands:
sudo apt-get update
sudo apt-get install -y sysstat htop atop
Enable sysstat if needed, then collect:
- CPU utilization
- run queue / load
- memory used/free
- swap activity
Examples:
sar -u 1 10
sar -r 1 10
sar -q 1 10
sar -S 1 10
What to look for:
- sustained CPU > 70–80% during peaks
- swap usage or non-zero swap in/out
- load average much higher than vCPU count
- memory available getting very low
If any of those happen now, that’s a sign your current host may already be under-sized.
---
2) Disk usage and I/O
For Docker workloads, disk is often overlooked.
Check:
- total filesystem usage
- Docker data dir usage
- disk latency / utilization
- temp working dirs
Commands:
df -h
du -sh /var/lib/docker
docker system df
iostat -xz 1 10
If iostat is not installed:
sudo apt-get install -y sysstat
What to look for:
- %util near 100% on busy disks
- high await values
- /var/lib/docker growing quickly
- image cache consuming most disk
- temp directories filling up
For your use case, SSD is strongly preferred.
---
3) Network throughput
Since you mentioned tens of GB/day moved, network probably isn’t huge, but you still want to observe peaks.
Commands:
sar -n DEV 1 10
ip -s link
If you want a quick live view:
sudo apt-get install -y iftop nload
Look for:
- bursts during image pulls
- repo clonesMarvin
07/31/2026, 4:19 PMdocker stats --no-stream
Better: sample it periodically during a busy window:
while true; do
date
docker stats --no-stream
sleep 60
done | tee docker-stats.log
What to capture:
- number of containers running simultaneously
- memory used per container
- CPU % per container
- which containers are consistently the biggest
If container names are ephemeral, correlate them to deployment names if possible via labels or naming conventions.
Also inspect images:
docker images
docker system df -v
This tells you:
- image sizes
- layer reuse
- whether repeated pulls are expensive
---
5) Historical container metrics
If you don’t already have metrics, consider adding one of these for a week:
- cAdvisor
- Netdata
- Prometheus + Grafana
- Datadog / New Relic / your existing infra monitoring
For Docker-heavy Prefect environments, cAdvisor + node_exporter is a very practical combo because it gives:
- per-container CPU
- per-container memory
- filesystem usage
- network usage
- host metrics
If you already have VMware/Hyper-V host metrics, those can help too, but guest OS/container metrics are better.
---
The most useful “concrete numbers” to bring back to IT
Try to produce these 10 values:
1. Peak concurrent Prefect flow containers
2. Average concurrent containers
3. Typical CPU per container
4. Peak CPU per heavy container
5. Typical memory per container
6. Peak memory per heavy container
7. Total host memory used at peak
8. Docker storage currently in use
9. Daily image pull / repo clone behavior
10. Peak network throughput during busiest hour
With those, you can make a much stronger recommendation.
---
How to turn those into hardware sizing
A good first-pass formula:
CPU
required_vcpu ≈ sum(peak_cpu_per_concurrent_container) × headroom
Use headroom of about 1.3 to 1.5.
Memory
required_ram ≈ sum(peak_memory_per_concurrent_container) + OS/docker overhead + headroom
For Linux + Docker + worker overhead, I’d reserve at least:
- 2–4 GB for OS/platform overhead on a small host
- more if you run monitoring/security agents
Then add 20–30% memory headroom.
Disk
required_disk ≈ docker_images + temp_run_space + logs + growth_headroom
For Docker-based execution, don’t size only to current usage; allow room for:
- multiple images
- old layers before cleanup
- temp files from active runs
- log retention
---
Example sizing workflow
Suppose you observe:
- peak concurrent containers: 8
- typical memory: 1.5 GB/container
- 2 heavy jobs peak at 4 GB each
- typical CPU: ~0.5–1 vCPU/container
- peak total active CPU during busy hour: ~6 vCPU
- Docker storage: 55 GB
- temp usage during peaks: 20 GB
Then I’d estimate:
Memory
- 6 normal containers × 1.5 GB = 9 GB
- 2 heavy containers × 4 GB = 8 GB
- subtotal = 17 GB
- add OS/Docker/monitoring = 4 GB
- subtotal = 21 GB
- add headroom = ~27 GB
=> recommend 32 GB RAM
CPU
- observed peak around 6 vCPU
- add headroom 1.5x
=> recommend 8–12 vCPU
Disk
- 55 GB Docker
- 20 GB temp
- OS/logs/working space/headroom
=> recommend 150–200 GB SSD minimum
That’s the kind of defensible recommendation infra teams like.
---
If you want a quick-and-dirty data collection checklist, use this
During a representative busy period, run:
date
uptime
nproc
free -h
df -h
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
docker stats --no-stream
docker system df
sar -u 1 5
sar -r 1 5
sar -n DEV 1 5
iostat -xz 1 5
And save the output.
You can also repeat that every 5–15 minutes during your busiest few hours.
---
Best practice: identify your heaviest 3 deploymentsMarvin
07/31/2026, 4:19 PM