documentation

Daemon

The Cycleswap daemon runs in the background on every registered machine. When the machine is idle, it pulls queued jobs and runs them.

What "idle" means

The daemon considers a machine available only when all of these are true:

MetricCondition
Not manually pausedcycle daemon pause hasn't been run recently
CPU usageNon-job usage ≤ 5% (averaged across all cores)
RAM usageNon-job usage ≤ 16 GB
GPU compute utilizationNon-job SM utilization ≤ 5% (NVIDIA only)
GPU memory usageNon-job VRAM usage ≤ 2 GB (NVIDIA only)
Screen inhibitNo screen inhibit active (e.g. YouTube keeping the screen awake)
User inactivityNo keyboard or mouse input for at least 5 minutes

If any condition fails, the daemon waits and re-checks before picking up a job. If a machine isn't picking up jobs you expect it to, this table is the first place to look.

Pausing the daemon

To temporarily stop the daemon from picking up new jobs without deregistering the machine:

# Pause for 8 hours (default)
cycle daemon pause

# Pause for a specific duration
cycle daemon pause 2h

Resume early with:

cycle daemon resume

Resource limits

Every job container runs with memory and process limits to protect the host machine. A runaway job cannot exhaust the machine's RAM or fork-bomb the system.

LimitDefault
Memory90% of total system memory
Max processes4096

If a job exceeds the memory limit, the container is killed and the job is marked as failed. The log output will include an out-of-memory message so you can tell what happened. PID limits prevent fork bombs; if a process hits the limit, new fork() calls fail and the job will typically crash on its own.

When testing locally with cycle project test, you can pass --skip-limits to remove these caps. Jobs running on the daemon always have limits applied.

Running your own jobs on your busy machines

By default, busy self-assignment is enabled. That means jobs you queued can be assigned to your own machines even while they are marked BUSY (i.e. you are actively using them). Other people's jobs still wait for the machine to go idle.

Note

The scheduler prefers idle machines over busy ones. Your busy machine is only used when no idle machine is available for a given job.

If you want your machines to only run your jobs when fully idle, disable it:

cycle daemon forbid-busy-assign

To re-enable:

cycle daemon allow-busy-assign