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:
| Metric | Condition |
|---|---|
| Not manually paused | cycle daemon pause hasn't been run recently |
| CPU usage | Non-job usage ≤ 5% (averaged across all cores) |
| RAM usage | Non-job usage ≤ 16 GB |
| GPU compute utilization | Non-job SM utilization ≤ 5% (NVIDIA only) |
| GPU memory usage | Non-job VRAM usage ≤ 2 GB (NVIDIA only) |
| Screen inhibit | No screen inhibit active (e.g. YouTube keeping the screen awake) |
| User inactivity | No 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 2hResume early with:
cycle daemon resumeResource 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.
| Limit | Default |
|---|---|
| Memory | 90% of total system memory |
| Max processes | 4096 |
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.
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-assignTo re-enable:
cycle daemon allow-busy-assign