CPU Support and Power Capping
Joulie supports node-level CPU power capping through NodeTwin intents enforced by the agent.
Contract model
CPU intent is defined in NodeTwin.spec.cpu:
packagePowerCapWatts(optional absolute cap)packagePowerCapPctOfMax(optional normalized profile intent)
Precedence:
packagePowerCapWattsif present- otherwise
packagePowerCapPctOfMax
Policy behavior
Operator profile assignment remains performance vs eco.
CPU cap values are generated per profile and written into NodeTwin.spec:
- performance profile typically maps to a higher cap (often 100%)
- eco profile maps to a lower cap
For heterogeneous nodes, percentage-based intent remains useful because each node resolves normalized intent using node-local capabilities. If percentage intent cannot be converted to watts (for example missing RAPL range), the agent applies a DVFS percent fallback path when possible.
Driver/back-end semantics
Joulie is designed around standard Linux CPU power/frequency controls:
- AMD platforms:
amd-pstate/CPPC semantics - Intel platforms:
intel_pstatesemantics
In simulator mode, CPU dynamics include utilization-dependent power curves, cap effects, and DVFS settling behavior. They now also include:
- CPU cap application settling (
cpuCapApplyTauMs) - exported telemetry averaging (
cpuTelemetryWindowMs) - first-order thermal behavior and thermal-throttle thresholds
- workload-sensitive slowdown based on
memoryIntensityandioIntensity
Measured vs proxy models
Joulie distinguishes:
- exact measured curves (for selected inventory-backed CPU platforms, e.g. SPECpower-backed)
- proxy/inferred curves where direct public measured curves are unavailable
See Hardware Modeling for full model provenance and references.
Scheduling guidance
Workload placement intent is expressed via the joulie.io/workload-class pod annotation:
performance: must run on full-power nodes (extender hard-rejects eco nodes)standard: default, can run on any node; adaptive scoring steers toward eco when performance nodes are congested
The scheduler extender enforces these classes; CPU capping is then enforced through NodeTwin.spec.