# Z840 Power Consumption Study
A before/after power study documenting the Z840's evolution from a dual-socket Xeon workstation into a dedicated local AI inference box. Measured and documented 2026-05-18 for posterity — this was the early days of running local AI at home on recycled enterprise iron, before it became normal.
—
## The Machine
HP Z840 Workstation. Bought second-hand. Repurposed as a local AI inference box running Ollama, Open WebUI, and Hermes monitoring. 128GB ECC DDR4 — retained because RAM prices made starting fresh impractical.
See z840 for full hardware spec and service documentation.
—
## Phase 1 — Baseline (2026-05-18, pre-upgrade)
CPUs installed: 2× Intel Xeon E5-2698 v3 @ 2.30GHz - 16 cores / 32 threads per socket - TDP: 135W each — 270W combined TDP - Architecture: Haswell-EP (v3), LGA 2011-3
GPU installed: NVIDIA Quadro M4000 (original workstation card, placeholder) - 8GB GDDR5 - Not suitable for modern AI inference
RAM: 128GB DDR4 ECC Registered @ 2133 MT/s (8× 16GB DIMMs across both sockets)
### Measured idle power draw (RAPL, system at rest, load avg ~0.00)
| Component | Idle Draw |
| ———– | ———– |
| CPU socket 0 (E5-2698 v3) | 21.3W |
| CPU socket 1 (E5-2698 v3) | 19.8W |
| DRAM | ~0.6W |
| Quadro M4000 (nvidia-smi) | 42.3W |
| Total measured | ~84W |
Note: RAPL measures CPU package power only. Wall draw will be higher due to
motherboard, storage, fans, and PSU inefficiency. Estimated wall idle: 150–180W
### AI inference capability at this stage
- Ollama running but limited by Quadro M4000 (8GB VRAM, no modern tensor cores) - Models constrained to ~7B parameter quantised - No tensor parallelism across cards
—
## Phase 2 — CPU Upgrade (arriving 2026-05-19)
CPUs incoming: 2× Intel Xeon E5-2620 v4 @ 2.10GHz - 8 cores / 16 threads per socket - TDP: 85W each — 170W combined TDP (vs 270W before — saving 100W TDP) - Architecture: Broadwell-EP (v4), LGA 2011-3 - Cost: £24 for the pair (eBay)
Why this makes sense: The GPU does the AI heavy lifting. CPU cores are largely idle during inference — they're just feeding data and managing I/O. Dropping from 16-core to 8-core per socket costs nothing in real-world AI performance.
### Expected power improvement
| Scenario | Before (v3) | After (v4) | Saving |
| ———- | ————- | ———— | ——– |
| CPU TDP (both sockets) | 270W | 170W | 100W |
| Estimated CPU idle draw | ~41W | ~25W | ~16W |
| Estimated wall idle | ~150–180W | ~130–160W | ~20W |
Measured figures to be recorded after swap — see Phase 2 update below.
—
## Phase 3 — GPU Upgrade (cards arriving, date TBC)
GPUs incoming: 2× NVIDIA GeForce RTX 3060 - 12GB GDDR6 each — 24GB total VRAM across both cards - TDP: 170W each — 340W combined at full load - Architecture: Ampere — proper tensor cores, CUDA compute 8.6 - Cost: TBC
### AI capability step-change
| Capability | Quadro M4000 | 2× RTX 3060 |
| ———— | ————– | ————– |
| VRAM | 8GB | 24GB (12GB×2) |
| Max model size (quantised) | ~7B | ~70B (split across cards) |
| Inference speed | Slow | Fast |
| Stable Diffusion | Marginal | Excellent |
| Tensor cores | No | Yes |
### Power at full AI load (estimated)
| Component | Full Load Draw |
| ———– | —————- |
| 2× E5-2620 v4 | ~120W |
| 2× RTX 3060 | ~300W |
| Motherboard/RAM/fans | ~50W |
| Estimated wall draw | ~500–550W |
Z840 PSU is 1125W — plenty of headroom.
—
## Phase 4 — Power Mitigation Scripts (planned)
Once GPUs are installed, a set of scripts and Hermes integrations will manage power dynamically to reduce idle draw:
### GPU power capping (nvidia-smi)
At idle, cap each 3060 to ~50W. On job start, restore full power limit:
```bash # /usr/local/bin/gpu-power-idle.sh nvidia-smi -i 0 -pl 50 nvidia-smi -i 1 -pl 50
# /usr/local/bin/gpu-power-full.sh nvidia-smi -i 0 -pl 170 nvidia-smi -i 1 -pl 170 ```
### CPU core parking (single socket at idle)
When no heavy job is queued, offline all cores on socket 1:
```bash # /usr/local/bin/cpu-park-socket1.sh for cpu in $(cat /sys/devices/system/node/node1/cpulist | tr ',' ' '); do
echo 0 > /sys/devices/system/cpu/cpu${cpu}/online
done
# /usr/local/bin/cpu-unpark-socket1.sh for cpu in $(cat /sys/devices/system/node/node1/cpulist | tr ',' ' '); do
echo 1 > /sys/devices/system/cpu/cpu${cpu}/online
done ```
### Hermes integration (planned)
- Add GPU wattage to Hermes Z840 stats endpoint (`nvidia-smi –query-gpu=power.draw`) - Alert if combined GPU draw exceeds 400W unexpectedly - Dashboard panel showing real-time power consumption - Auto-cap GPUs after 30 minutes of idle inference
—
## Phase 2 Results — POST CPU SWAP (measured 2026-05-19, ~2 hours post-install, 34°C ambient)
``` CPU socket 0 (E5-2620 v4): 15.2W CPU socket 1 (E5-2620 v4): 14.0W DRAM socket 0: 1.9W DRAM socket 1: 0.9W GPU (Quadro M4000): 42.3W Total measured (RAPL + nvidia-smi): ~74W Estimated wall draw: ~130–150W Saving vs Phase 1 (CPU package only): ~12W ```
RAPL sampled at idle (load avg ~0.00), 5-second window per domain.
DRAM figures slightly higher than Phase 1 sample — within normal variance.
CPU package power: 41.1W → 29.2W combined (-29% reduction).
## Phase 3 Results — POST GPU SWAP (to be filled in after cards arrive)
``` CPU socket 0 (E5-2620 v4): _W CPU socket 1 (E5-2620 v4): _W 2× RTX 3060 at idle: _W Total measured idle: _W Estimated wall idle: ___W
2× RTX 3060 at full inference load: _W Total measured load: _W Estimated wall load: _W Saving vs Phase 1 idle: _W Monthly cost at UK avg (28p/kWh, idle 18h/day + load 6h/day): £___ ```
—
## Cost Context (UK electricity, May 2026)
UK average electricity price: ~28p/kWh
| Scenario | Draw | Daily cost | Monthly cost |
| ———- | —— | ———– | ————– |
| Phase 1 idle 24/7 | ~165W | £1.11 | £33.80 |
| Phase 4 idle 18h + load 6h | ~160W idle + ~500W load | £0.97 | £29.50 |
| Phase 4 idle only (nights off) | ~160W × 12h | £0.54 | £16.40 |
Moral: the CPUs are not the enemy. The GPUs at full load are. Smart scheduling
and power capping matter more than the CPU swap — but every watt counts.
